AWS Elastic Beanstalk で構築した Laravel 環境で、普段から問題なく実行できていた artisan コマンドが失敗する事態に遭遇しました。
問題の切り分けに苦戦して結構ハマったので原因と解決方法を共有します。
TL;DR
-
sudo php artisan
の形で実行すると必要な環境変数が引き継がれずに失敗する。 -
sudo su -
で root ユーザーとして実行すれば問題ない。
事象
eb ssh
で EC2 インスタンスにログイン後、以下のように artisan コマンドを実行する1もエラーが発生してしまいました。
$ sudo php artisan
In ClientResolver.php line 397:
Missing required client configuration options:
region: (string)
A "region" configuration value is required for the "translate" service
(e.g., "us-west-2"). A list of available public regions and endpoints can be
found at http://docs.aws.amazon.com/general/latest/gr/rande.html.
region 関連の設定が漏れているようですが、関連しそうな環境変数は Elastic Beanstalk の 環境プロパティ から設定しており、 env
でも EC2 インスタンスに反映されていることが確認できました。
$ env | grep AWS_DEFAULT_REGION
AWS_DEFAULT_REGION=us-east-1
Laravel 側で設定を上手く読み込めていない可能性も考えましたが、 dd
で dump しても設定されていることが確認できる状態でした。
原因
Elastic Beanstalk やアプリケーションの問題ではなく、 sudo
コマンド実行時の挙動として必要な環境変数が引き継がれていないことが原因でした。
sudo
コマンド実行時の環境変数の扱いは /etc/sudoers
に記載されている ので、中身を確認してみます。
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
env_keep
に記載された環境変数が継承された状態でコマンドが実行されますが、基本的な環境変数以外は特に含まれていないことが分かります。
このため AWS_DEFAULT_REGION
など幾つかの必要な環境変数が設定されていない状態で artisan コマンドが実行される形となり、前述のエラーが発生したようです。
解決方法
sudo su -
で root ユーザーとして artisan コマンドを実行すれば環境変数が設定された状態なので成功します。
$ sudo su -
$ php artisan
普段はこちらの方法で作業していたのですが、何故か今回は sudo
で実行していました...。
まとめ
sudo
で実行するか sudo su -
後に実行するかの違いを意識する場面はあまり多くないと思います。
ただ稀にこういった形でハマることもあるので、 Elastic Beanstalk のようにインフラの詳細をあまり意識しなくても良いサービスを利用していてもこの辺りの挙動は理解しておいた方が良さそうです。
-
導入しているパッケージの関係で権限の問題があるため
sudo
で実行しています。 ↩