Help us understand the problem. What is going on with this article?

AWS 上に構築した Laravel 環境での sudo php artisan 実行時に環境変数が適用されずにハマった話

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 のようにインフラの詳細をあまり意識しなくても良いサービスを利用していてもこの辺りの挙動は理解しておいた方が良さそうです。


  1. 導入しているパッケージの関係で権限の問題があるため sudo で実行しています。 

macloud
M&Aクラウドは「テクノロジーの力で、M&Aに流通革命を」をミッションにM&Aプラットフォーム「M&Aクラウド」を開発運営するスタートアップです。
https://macloud.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away