はじめに
ECS環境で .env
ファイルの読み込みエラーが発生し、アプリケーションの動作に支障が出ていました。
本記事では、その原因と GO_ENV=prod
を追加することでエラーを解消する方法について説明します。
変更の背景
ECS環境で .env
ファイルが読み込めず、以下のエラーが発生していました。
.envファイルが読み込めません: open .env: no such file or directory
この問題の原因は、ECS環境で GO_ENV
の設定が未定義または dev
のままだったことです。
本来、GO_ENV=prod
にすることで .env
の読み込みを回避し、環境変数を適切に適用する必要があります。そのため、ECSのタスク定義 (aws_ecs_task_definition.main
) に GO_ENV=prod
を追加しました。
変更前のECSタスク定義
"environment": [
{
"name": "MYSQL_USER",
"value": "myuser"
},
{
"name": "MYSQL_PW",
"value": "${jsondecode(data.aws_secretsmanager_secret_version.rds_password_v5.secret_string)[\"password\"]}"
},
{
"name": "MYSQL_HOST",
"value": "${aws_db_instance.rds_instance.endpoint}"
},
{
"name": "MYSQL_PORT",
"value": "3306"
},
{
"name": "MYSQL_DB",
"value": "mydatabase"
}
]
この状態では GO_ENV
が設定されておらず、アプリケーションが .env
の読み込みを試みてエラーになっていました。
変更後のECSタスク定義
GO_ENV=prod
を追加し、環境変数の適用を強制しました。
"environment": [
{
"name": "GO_ENV",
"value": "prod"
},
{
"name": "MYSQL_USER",
"value": "myuser"
},
{
"name": "MYSQL_PW",
"value": "${jsondecode(data.aws_secretsmanager_secret_version.rds_password_v5.secret_string)[\"password\"]}"
},
{
"name": "MYSQL_HOST",
"value": "${aws_db_instance.rds_instance.endpoint}"
},
{
"name": "MYSQL_PORT",
"value": "3306"
},
{
"name": "MYSQL_DB",
"value": "mydatabase"
}
]
これにより、ECS環境で GO_ENV=prod
が適用され、.env
の読み込みが不要になります。
適用方法
1. Terraformの変更を適用
Terraformの設定を変更した後、以下のコマンドを実行して適用します。
terraform init
terraform apply -auto-approve
2. ECSのタスクを再デプロイ
Terraformの適用後、ECSのサービスを強制的に再デプロイし、新しい環境変数が適用されるようにします。
aws ecs update-service --cluster my-ecs-cluster --service my-ecs-service --force-new-deployment
変更後の影響
- ECS環境で
.env
が不要になり、エラーが解消 - アプリケーションが正しく環境変数を使用するようになる
- デプロイ時の安定性向上(開発環境と本番環境の分離が明確になる)
まとめ
ECS環境で .env
ファイルが読み込めないエラーの原因は、環境変数 GO_ENV
が未定義だったことでした。タスク定義に GO_ENV=prod
を追加することで .env
の依存をなくし、環境変数のみで動作するように修正しました。
Terraformの適用とECSの再デプロイを行うことで、安定したデプロイ環境を実現できます。