ECS(Fargate)でLaravelの環境変数の設定方法


AWS ECSでLaravelのコンテナを動かす場合、DB接続情報などの環境変数を設定する方法を考えました。
結論から言うとFargateのタスク定義の環境変数に設定する方法が一番いいのでは?と考えました。

環境変数の設定方法

Laravelでは.envに環境変数を記述します。ECSで公開する場合、本番環境用の.evnファイルをDockerイメージに入れてビルドするという記事が多いように思います。
この方法だと少し面倒で.envファイルを2種類用意しなければなりません。
また、Volumesを使ってEFSなどを参照する方法もあるかと思いますがどちらにしろ.envファイルが2種類必要になります。

環境変数の参照方法

Laravelで環境変数を取得する場合env()関数を使用します。

databese.php
        ...
        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            ...

このenv()関数ではOSの環境変数も取得することができます。
例のdatabase.phpのDB_HOSTが、もし.envに無くOSの環境変数にDB_HOSTがあればその値を参照します。

ローカルのDockerで試してみる

  1. .envファイルからDB_HOSTを削除します。
  2. DockerのenvironmentでDB_HOSTを設定します。
docker-compose
  php:
    container_name: myWork-php
    ...
    environment:
      DB_HOST: myWork-db
    ...

  db:
    image: mysql:5.7
    container_name: myWork-db

これでDockerを起動した場合、コンテナの環境変数にはDB_HOSTがセットされ、Laravelはそれを参照するようになります。

# env | grep DB_HOST
DB_HOST=myWork-db

Fargateでも環境変数を設定できる

ECSのタスク定義はdockerと同じことができるので、コンテナの環境変数をセットすることができます。

環境変数はSSMのパラメータリストから取得することができるので、よりセキュアで疎結合な設定が可能です。

まとめ

以上によりローカルの開発環境の.envファイルをそのまま本番環境でも使用できるようになります。