2022年8月15日月曜日

Beanstalkをamazon linux2に上げたら、cronでrakeコマンドが叩けなくなった件

 今まで、Amazon linuxベースで、Beanstalkを展開していたら、下記のようにシェルスクリプトを書いておけばrailsのタスクを実行できていましたよね。

#!/usr/bin/env bash
set -xe
EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir)
EB_DEPLOY_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)
. $EB_SUPPORT_DIR/envvars
. $EB_SCRIPT_DIR/use-app-ruby.sh

cd /var/app/current
bundle exec rake ***:*****

ところがAmazon linux2になったら、/opt/elasticbeanstalk/bin/get-configの情報が変わって、script_dirが無いよ!というエラーがでるようになりました。

環境変数はAWSが公表している通り、下記ページを参考にすれば読み込むことができて、
下のように環境変数読み込み部分を削除してしまえば、サーバにログインしてから下記ファイルを直接叩いたら、動くことが確認できました。
#!/usr/bin/env bash
cd /var/app/current
bundle exec rake ***:*****
しかしながら、cronで叩くと、エラーがでて動きません。
/usr/bin/env: ruby: No such file or directory

どうしたものかと試行錯誤の結果、
crontabファイルのPATH指定部分に、rubyのディレクトリを追加
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/elasticbeanstalk/.rbenv/shims
かつ、シェルスクリプトで上記AWS公表の環境変数の更新をかけたら動きました。
#!/usr/bin/env bash
source /etc/profile.d/sh.local
cd /var/app/current
bundle exec rake ***:*****

なんかBeanstalk Amazon linux2について、CronとかRakeタスクの情報がぜんぜんないのですが、みなさんあたりまえに対応しているのか、そもそもサーバで叩かないのがセオリーなのか、どうなのでしょう・・・・・?



2022年7月12日火曜日

BeanstalkをAmazon linux2にあげるにあたって苦労した所

2022/6末に、Amazon linuxが廃止されて、Amazon linux2になるということで対応を進めていましたが、期限を過ぎてもうまくいかなかったのがようやく対応できたので、メモ。

Beanstalkで環境を作ると、100 % of CPU is in use. になり続ける。

デプロイが完了しても、この状態が続きました。ログを見ると、Pumaログに、こういったエラーが出続けていました。

[8108] ! Unable to start worker
[8108] /var/app/current/vendor/bundle/ruby/2.7.0/gems/actionmailer-6.1.6/lib/action_mailer/base.rb:589:in `method_missing'
[8108] Early termination of worker


ただ、actionmailerのバージョンや、その周りのrails関連のバージョンは問題がなさそうでした。これ以外のエラーがログに無いという状態で、Rubyを3.0の環境に変えてみたり、設定を順に削除してなるべくシステムをシンプルにしてみても解決せず。

サーバでRakeコマンドを使えるようにした。

スムーズにAL2への以降ができた別プロジェクトで、cronが動いていないことがわかり、調べていると、rakeコマンドがAL2環境で使えないことがわかりました。ネットでは、

./opt/elasticbeanstalk/support/envvars

を読み込むと簡単みたいな記事が散見されましたが、サーバ内にenvbars無い。
そこで見つけたのがこちら
https://aws.amazon.com/jp/premiumsupport/knowledge-center/elastic-beanstalk-env-variables-shell/

.ebextentions/01_set_vars.confに以下を追加してデプロイ。
commands: setvars: command: /opt/elasticbeanstalk/bin/get-config environment | jq -r 'to_entries | .[] | "export \(.key)=\"\(.value)\""' > /etc/profile.d/sh.local packages: yum: jq: []
これでrakeコマンドを始めとして色々なコマンドが使えるようになりました。
サーバにログインし、
#cd /var/app/current
#bundle exec pumactl start
PUMAを動かしてみると、rails6に変えたことで出てきたエラーが表示されました。これらのエラーはローカルではでなかったものでした。
ということで、エラーを取り除いて再度デプロイ。
解決!