はじめに
ECSでDocker Composeを利用してタスク定義をしたい場合、ECS CLIを利用すると思います。
その際環境変数に初期パスワード等を入れたくても、平文で登録するわけにはいないので困るケースがあると思います。
その解決策として、ECSでは環境変数の値をParameter Store(Secure String 含む)とSecrets Managerの値を利用することができます。
それによりDocker Compose内に機密情報を記載する必要がなく、またParameter Store(Secure String)またはSecrets Managerで暗号化された状態で管理できるので、セキュアに機密情報を管理することができます。
今回はecs-cli composeを利用した際に環境変数にParameter Store(Secure String)を利用する方法を記載します
本記事の対象外の範囲
本記事では以下の内容については対象外とさせていただきます。
- ECS 自体の解説/利用方法
- Parameter StoreまたはSecrets Managerの解説/利用方法
- ecs-cli の利用方法
事前準備
ECS タスク実行用のIAM Role 作成
タスク実行ロールにパラメータストアにアクセスするための権限の追加が必要です。
今回は以下の権限を追加しています。
- AmazonSSMReadOnlyAccess
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"ecr:GetAuthorizationToken",
"ssm:GetParameter",
"logs:PutLogEvents",
"ecr:BatchCheckLayerAvailability"
],
"Resource": "*"
}
]
}
またパラメータストアで利用するKMSの鍵をAWS 管理 CMK alias/aws/ssm
以外のユーザ作成のCMKを利用する場合は、追加でkms:Decrypt
の権限が必要となります。
パラメータストアへの機密情報登録
パラメータストアで環境変数内で利用したい機密情報をSecure String
で登録します。
今回は利用する鍵はAWS 管理 CMK alias/aws/ssm
を利用する形にしています。
Docer compose ファイルの準備
今回は例としてMySQL
のコンテナでrootパスワードをParameter Store(Secure String)を利用する方法とします。
元にするDocker-composeはDocker HubにあるMySQL公式のページ内にあるComposeファイルを利用したいと思います。
- 元ファイル
# Use root/example as user/password credentials
version: '3.1'
services:
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
adminer:
image: adminer
restart: always
ports:
- 8080:8080
参考:https://hub.docker.com/_/mysql
実際に作成した Doker Composeは以下となります。
version: '3'
services:
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
adminer:
image: adminer
restart: always
ports:
- 8080:8080
内容を見るとわかると思いますが、environment
が無くなっています。
実は環境変数でParameter Storeの値を利用したい時はDocker Compose ファイル内では定義できません。
今回の様にDocker Compose で定義できないパラメータは、別ファイル(デフォルトではecs-params.yml)でパラメータを定義する必要があります。
参考:https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/cmd-ecs-cli-compose-ecsparams.html
なお、composeファイルのバージョンを変更していますが、こちらはECS CLI のcomposeのバージョンが3.1が対応していないため、今回は3に変更しました。
今回利用するecs-params.yml は、以下の通りです。
環境変数はコンテナ単位で設定となり、環境変数をパラメータストア名(Secure String)で指定できます。
また、今回Fargateで起動させるので、Fargateを利用するために必要なパラメータも含めています。
version: 1
task_definition:
ecs_network_mode: awsvpc
task_execution_role: [タスク実行RoleのARN]
task_size:
cpu_limit: 1024 #Fargate利用のため必要
mem_limit: 2048 #Fargate利用のため必要
services:
db: #コンテナ名
secrets:
- value_from: MYSQL_ROOT_PASSWORD_SSM # パラメータストア名
name: MYSQL_ROOT_PASSWORD # 環境変数名
# 以下、Fargate利用のため、必要
run_params:
network_configuration:
awsvpc_configuration:
subnets:
- [Sunbet1]
- [Sunbet2]
security_groups:
- [利用SG]
assign_public_ip: ENABLED
タスク実行(ecs-cli compose up)
以下のコマンドでECSのタスクを実行します。
なお、今回はECS Service の作成は行わない構成としています。
$ ecs-cli compose \
--project-name [プロジェクト名] \
--region ap-northeast-1 \
--aws-profile [aws プロファイル名] \
--cluster [クラスタ名] \
--file docker-compose.yml \
--ecs-params ecs-params.yml \
--task-role-arn [ECSタスクRole ARN]
up --launch-type FARGATE
確認
以下の様にパラメータストアに保存したパスワードを利用してmysqlにログインすることができます。
$ mysql -h [ECSタスクのパブリックIP] -u root -p
Enter password: [パラメータストア保存のパスワード]
mysql>
まとめ
今回、ECSの環境変数内でParameter Store(Secure String)を利用する方法を紹介させていただきました。
Parameter Store(Secure String)を利用することで機密情報の利用が簡単に且つ安全に利用することができるので、積極的に利用していきたいと思います。