Systemdを使ってEC2インスタンス起動時にスクリプト実行
環境
Amazon Linux 2
/etc/systemd/system配下に.serviceファイルを作成
code:/etc/systemd/system/sample.servise
Description = sample daemon
User=root
ExecStart = /opt/sample.sh
RemainAfterExit=yes
Type = oneshot
WantedBy = multi-user.target
以下のような任意のshell scriptを実行できる
code:/opt/sample.sh
SSH_PASS=$(aws secretsmanager get-secret-value --secret-id シークレット名 | jq -r '.SecretString' | jq -r '.SIGNER_SSH_PASSWORD');
SIGNER_SSH_PASSWORD=$SSH_PASS /usr/local/bin/supervisord
export SIGNER_SSH_PASSWORD=$SSH_PASS
注意点
Typeの指定は以下の通り
code:Type
simple: ExecStartのコマンドがそのままメインプロセス
forking: ExecStartの子プロセスがメインプロセス
oneshot: ExecStartが終了してもメインプロセスが残る・残らないに関係なくとにかく一度実行(メインプロセス自体がなくてもよい)さらにRemainAfterExit=yesにすることで、ExecStart終了後もsystemctl statusは正常(active Exited)になる。
shを実行したのちも残り続けるプロセスを実行したい場合には RemainAfterExit=yesを指定する必要がある
User=rootのように実行userを指定しないと環境変数にアクセスできない
実行するshの中で環境変数を設定する場合は、もちろん同一shell内じゃないと使用できないので、その環境変数を使用してプロセス実行したいプロセスは同一shの中で実行する
awsコマンドで一度parameterを取得してくる処理などしたい場合はType=oneshotじゃないとダメ
exportの可否
各種コマンド
sudo systemctl list-unit-files --type=service | grep sample でserviceとして認識されたかどうかチェック
sudo systemctl enable sampleで自動起動onに設定
sudo systemctl daemon-reloadでdaemonを更新
sudo systemctl start sample.serviceでserviceを開始
sudo systemctl status sample.service でserviceのstatus確認
sudo systemctl stop sample.serviceでserviceを停止
設定が完了したら sudo rebootしてserviceが実行されているかを確認しよう