ECSのコンテナ定義からパラメータストアが参照できるようになった!
ECSのコンテナ定義からパラメータストアが参照できるようになった!:
ECSのコンテナ定義を眺めていたところ見慣れない文言が。
ドキュメントも更新されていました。
Specifying Sensitive Data
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html
というわけで、もしDBパスワードのようなセンシティブ情報を環境変数に
直接入れてしまっている場合は、パラメータストアから参照するようにしましょう。約束です。
注意点としては、2018/11/16時点でFargateには対応していません。
コンテナエージェントのバージョンが1.22.0以降である必要があります。
既存のコンテナインスタンスで実行するにはエージェントの更新が必要です。
現在のコンテナインスタンスが1.21.0を実行していましたので以下の手順を参考に更新を行います。
Updating the Amazon ECS Container Agent
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html
LinuxのECS最適化AMIであればコンソールまたはAWS CLIから更新が可能です。
コンソールの場合は、コンテナインスタンスの詳細ページからエージェントの更新を選択します。
AWS CLIの場合は以下のコマンドです。
ECSから参照させるパラメータストアを作成します。
ここでは以下のように設定しています。
名前: ecs-db-password
タイプ: 安全な文字列
KMSの主要なソース: 現在のアカウント
KMSキーID: alias/aws/ssm
値: password
ECSがパラメータストアを参照できるようにするため、
タスク実行ロールに以下のような権限を追加します。
secretsmanager:GetSecretValue および kms:Decryptはオプションです。
secretsmanager:GetSecretValue: パラメータストアから更にSecrets Managerを参照させる場合のみ必要です
kms:Decrypt: カスタムKMSキーを使用する場合のみ必要です。
今回はどちらも使用していません。
以下のようにインラインポリシーで追加しました。
タスク定義で新しいリビジョンを作成し、コンテナ定義を編集します。
環境変数で任意のキーを入力し、ValueFromを選択します。値にはパラメータ名を入力します。
異なるリージョンのパラメータストアを参照する場合はARNでの入力が必須です。
JSONで直接タスク定義を編集する場合には、containerDefinitionsに以下のように追加します。
後は通常どおりにサービス、タスクを起動します。
タスク起動後、コンテナに定義されている環境変数を確認すると、
パラメータストアの値が設定されていることが確認できます。
以上です。
参考になれば幸いです。
はじめに
ECSのコンテナ定義を眺めていたところ見慣れない文言が。'valueFrom'フィールドを使用して、AWS Systems ManagerのパラメータストアキーまたはARNを指定することもできます。 ECSは実行時にコンテナに値を注入します。やったぜ!
ドキュメントも更新されていました。
Specifying Sensitive Data
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html
というわけで、もしDBパスワードのようなセンシティブ情報を環境変数に
直接入れてしまっている場合は、パラメータストアから参照するようにしましょう。約束です。
注意点としては、2018/11/16時点でFargateには対応していません。
やってみる
ECS コンテナエージェントのアップデート
コンテナエージェントのバージョンが1.22.0以降である必要があります。既存のコンテナインスタンスで実行するにはエージェントの更新が必要です。
現在のコンテナインスタンスが1.21.0を実行していましたので以下の手順を参考に更新を行います。
Updating the Amazon ECS Container Agent
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html
LinuxのECS最適化AMIであればコンソールまたはAWS CLIから更新が可能です。
コンソールの場合は、コンテナインスタンスの詳細ページからエージェントの更新を選択します。
AWS CLIの場合は以下のコマンドです。
$ aws ecs update-container-agent --cluster cluster_name --container-instance container_instance_id
パラメータストアの作成
ECSから参照させるパラメータストアを作成します。ここでは以下のように設定しています。
名前: ecs-db-password
タイプ: 安全な文字列
KMSの主要なソース: 現在のアカウント
KMSキーID: alias/aws/ssm
値: password
タスク実行ロールへの権限追加
ECSがパラメータストアを参照できるようにするため、タスク実行ロールに以下のような権限を追加します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameters", "secretsmanager:GetSecretValue", ★オプション "kms:Decrypt" ★オプション ], "Resource": [ "arn:aws:ssm:<region>:<aws_account_id>:parameter/ecs-db-password", "arn:aws:secretsmanager:<region>:<aws_account_id>:secret:<secret_name>", ★オプション "arn:aws:kms:<region>:<aws_account_id>:key:<key_id>" ★オプション ] } ] }
secretsmanager:GetSecretValue: パラメータストアから更にSecrets Managerを参照させる場合のみ必要です
kms:Decrypt: カスタムKMSキーを使用する場合のみ必要です。
今回はどちらも使用していません。
以下のようにインラインポリシーで追加しました。
コンテナ定義の変更
タスク定義で新しいリビジョンを作成し、コンテナ定義を編集します。環境変数で任意のキーを入力し、ValueFromを選択します。値にはパラメータ名を入力します。
異なるリージョンのパラメータストアを参照する場合はARNでの入力が必須です。
JSONで直接タスク定義を編集する場合には、containerDefinitionsに以下のように追加します。
"containerDefinitions": [ ~~省略 "secrets": [ { "name": "DB_PASSWORD", "valueFrom": "ecs-db-password" } ], ~~以下略
動作確認
後は通常どおりにサービス、タスクを起動します。タスク起動後、コンテナに定義されている環境変数を確認すると、
パラメータストアの値が設定されていることが確認できます。
# docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' 01dbaed2e060 AWS_EXECUTION_ENV=AWS_ECS_EC2 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=/v2/credentials/xxxxxxxxxxxxxxxxxxx ECS_CONTAINER_METADATA_URI=http://169.254.170.2/v3/xxxxxxxxxxxxxxxxxxxxxxxxxx DB_PASSWORD=password ★パラメータストアの値が設定されている PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin APACHE_RUN_USER=www-data APACHE_RUN_GROUP=www-data APACHE_LOG_DIR=/var/log/apache2
参考になれば幸いです。
コメント
コメントを投稿