LoginSignup
0
0

More than 3 years have passed since last update.

どうやら本番サーバー上でsidekiqをサービスで動かすと環境変数が別物のようだ

Last updated at Posted at 2020-10-16

概要

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を追記。

/etc/systemd/system/sidekiq.service
[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でも同じ環境変数を使えるようにする。

/var/www/hoge-app/aws/service/sidekiq_exec_start.sh
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]
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0