概要
AWSのEC2上でsidekiqをsystemdでサービス化して起動していたところ、通したはずのPythonコマンド用の環境変数のPATHが効かない現象が起きたので調査した。
調査
コード中のいろんな箇所にwhoamiや環境変数を確かめるコマンドを差し込んだりした結果、
sidekiqのジョブとPOSTリクエストを受けているcontrollerで実行しているユーザが違うことからsidekiqをサービス起動する設定が怪しいことに気がついた。
ちなみにRspecやローカル環境は実行ユーザーに環境変数が効いていたからなのかsidekiqで失敗するジョブもオールグリーンだった。
ところでSystemdってなに?
ってぐぐってみたらこの記事が参考になった。
これからSystemd入門する
https://qiita.com/bluesDD/items/eaf14408d635ffd55a18
対処法
systemdのsidekiq.serviceファイルの設定を書き換えることにした。
systemdのsidekiq.serviceファイル
環境変数を読みこむシェルスクリプトを実行するようにExecStartPreを追記。
[Unit]
Description=sidekiq
After=syslog.target network.target
[Service]
WorkingDirectory=/var/www/hoge-app
ExecStartPre=/bin/sh /var/www/hoge-app/aws/service/sidekiq_exec_start.sh
ExecStart=/root/.rbenv/bin/rbenv exec bundle exec sidekiq -e production
・・・(中略)・・・
[Install]
WantedBy=multi-user.target
ExecStartPreで実行するシェルスクリプト
sourceで.bash_profile読んだり、exportでなど何らかの形で環境変数を設定した後、systemctlのset-environmentでsystemdでも同じ環境変数を使えるようにする。
source /home/ec2-user/.bash_profile
# systemdにも環境変数を適用
/bin/systemctl set-environment PYENV_ROOT="$PYENV_ROOT"
/bin/systemctl set-environment PATH="$PATH"
# Python関連の設定処理
pyenv global 3.8.3
eval "$(pyenv init -)"
# この時点で設定されている環境変数を任意のログファイルに書き出す。(デバッグ用)
LOGFILE=/var/www/hoge-app/log/production.log
echo "Sidekiq Service Exec Start Pre --------" >> $LOGFILE
echo "$PYENV_ROOT" >> $LOGFILE
echo "$PATH" >> $LOGFILE
python -V >> $LOGFILE
whoami >> $LOGFILE
echo "-------------------------------------" >> $LOGFILE
サービス再起動
systemctl daemon-reload
systemctl restart sidekiq.service
サービスのステータスがactiveかつ、ProcessのExecStartPreの記載が設定と一致していれば設定は成功。
後は実際にアプリケーションを動作させて確認。
[root@ip-*-*-*-* hoge-app]# systemctl status sidekiq.service
● sidekiq.service - sidekiq
Loaded: loaded (/etc/systemd/system/sidekiq.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2020-10-31 18:28:39 JST; 3s ago
Process: 7130 ExecStartPre=/bin/sh /var/www/hoge-app/aws/service/sidekiq_exec_start.sh (code=exited, status=0/SUCCESS)
Main PID: 7731 (bundle)
CGroup: /system.slice/sidekiq.service
└─7731 sidekiq 6.1.1 hoge-app [0 of 1 busy]