ecs-cli compose で環境変数にセキュア情報を利用する方法

Pocket

はじめに

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)を利用することで機密情報の利用が簡単に且つ安全に利用することができるので、積極的に利用していきたいと思います。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です