AWS ECSでLaravelのコンテナを動かす場合、DB接続情報などの環境変数を設定する方法を考えました。
結論から言うとFargateのタスク定義の環境変数に設定する方法が一番いいのでは?と考えました。
環境変数の設定方法
Laravelでは.envに環境変数を記述します。ECSで公開する場合、本番環境用の.evnファイルをDockerイメージに入れてビルドするという記事が多いように思います。
この方法だと少し面倒で.envファイルを2種類用意しなければなりません。
また、Volumesを使ってEFSなどを参照する方法もあるかと思いますがどちらにしろ.envファイルが2種類必要になります。
環境変数の参照方法
Laravelで環境変数を取得する場合env()
関数を使用します。
...
'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で試してみる
- .envファイルからDB_HOSTを削除します。
- DockerのenvironmentでDB_HOSTを設定します。
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ファイルをそのまま本番環境でも使用できるようになります。