ECSで動くgolangアプリに環境変数を注入する
背景
golangのアプリがあります。データベースのID、パスワードなどの認証情報を.env
で渡しています。
開発環境でテストする際はユーザにtestuser
、パスワードにtestpass
と簡易なものを使用しています。ただ、これだとECSに載せて、インターネットに公開するサービスにしてしまうのは怖いです。
そこで、ECSにのせるときに使用するタスク定義で環境変数としてコンテナに注入します。
なお、環境変数として渡すユーザやパスワードはパラメータストアやSecretsManagerに暗号化して格納しておいて、それを渡すのが本流です。しかし、ここでは簡易な文字列を渡す定義にしています。
方法
DBへの接続部分では以下のように記述されています。
dsn := fmt.Sprintf(
"host=%s user=%s password=%s dbname=%s port=%s sslmode=require TimeZone=Asia/Tokyo",
os.Getenv("DB_HOST"),
os.Getenv("DB_USER"),
os.Getenv("DB_PASSWORD"),
os.Getenv("DB_NAME"),
os.Getenv("DB_PORT"),
)
で、.env
は以下のように記述されています。
DB_HOST=localhost
DB_USER=testuser
DB_PASSWORD=testpass
DB_NAME=tesdb
DB_PORT=5432
このままだとECSにのせても動かないです。DB_HOSTはAWSのホスト名になりますので、少なくともここを変えないとです。
ECSにのせる際はタスク定義を使用します。ここに環境変数として記述します。
"environment": [
{
"name": "DB_NAME",
"value": "proddb"
},
{
"name": "DB_HOST",
"value": "proddb.aaaaaaaaaaa.ap-northeast-1.rds.amazonaws.com"
},
{
"name": "DB_PORT",
"value": "5432"
},
{
"name": "DB_USER",
"value": "produser"
},
{
"name": "DB_PASSWORD",
"value": "prodpass"
}
],
上はわかりやすいように定数で書いてます。が、SecretsManagerに暗号化して格納して、それを注入するのが良いです。