Edited at

DockerコンテナをローカルrunしたときECSと同じ様にSecretsManager/パラメータストアの値を環境変数に展開


やりたいこと

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/specifying-sensitive-data.html


Amazon ECS を使用すると、AWS Secrets Manager シークレットまたは AWS Systems Manager パラメータストアのパラメータに機密データを保存してコンテナの定義でそれを参照することによって、コンテナに機密データを挿入できます。この機能は、EC2 および Fargate の両方の起動タイプを使用するタスクでサポートされています。


これ、Secrets ManagerやSSMパラメータストアに保存している値をECSで実行するコンテナに環境変数として展開できるので便利です。

ただ、開発中などコンテナをローカルPCで実行(docker run)したいことも多いので、ローカル実行時も同じように展開するシェルを書きました。


やり方


要件


  • ServiceSettingsというパラメータを、dockerコンテナでSERVICE_SETTINGという環境変数に展開したい


前提条件


  • aws cliが入っていること


シェル

aws cliで値を引っ張ってきて -e で割り当てる


SecretsManagerの場合

setting=`aws secretsmanager get-secret-value --secret-id ServiceSetting --output text --query 'SecretString'`

docker run -it \
-e SERVICE_SETTING=$setting \
  ...

--output textにするのがミソ


SSM/ParameterStoreの場合

setting=`aws ssm get-parameter --name ServiceSetting --with-decryption --output text --query Parameter.Value | tr -d ' \n'`

docker run -it \
-e SERVICE_SETTING=$setting \
  ...

trでスペースと改行削除するのがミソ

暗号化してる前提で --with-decryption つけてます(してなかったらいらない)


これで

ストアの値を環境変数へ展開して利用するアプリケーション(on Docker)のコードを、ECS/ローカル実行で共通にできます。