ECSのコンテナ定義からパラメータストアが参照できるようになった!

ECSのコンテナ定義からパラメータストアが参照できるようになった!:


はじめに

ECSのコンテナ定義を眺めていたところ見慣れない文言が。

image.png

'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以降である必要があります。

既存のコンテナインスタンスで実行するにはエージェントの更新が必要です。



image.png


現在のコンテナインスタンスが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から更新が可能です。

コンソールの場合は、コンテナインスタンスの詳細ページからエージェントの更新を選択します。



image.png


AWS CLIの場合は以下のコマンドです。

$ aws ecs update-container-agent --cluster cluster_name --container-instance container_instance_id 


パラメータストアの作成

ECSから参照させるパラメータストアを作成します。

ここでは以下のように設定しています。



image.png


名前: 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 および kms:Decryptはオプションです。

secretsmanager:GetSecretValue: パラメータストアから更にSecrets Managerを参照させる場合のみ必要です

kms:Decrypt: カスタムKMSキーを使用する場合のみ必要です。

今回はどちらも使用していません。

以下のようにインラインポリシーで追加しました。



image.png



コンテナ定義の変更

タスク定義で新しいリビジョンを作成し、コンテナ定義を編集します。

環境変数で任意のキーを入力し、ValueFromを選択します。値にはパラメータ名を入力します。

異なるリージョンのパラメータストアを参照する場合はARNでの入力が必須です。

image.png

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 
以上です。

参考になれば幸いです。

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)