FargateでSSMのデータをコンテナ起動時に環境変数にセットする
はじめに
こんな機能が提供されましたが、
(重要)Fargateは対応していない
本当かどうか実際に試したところ、やはり対応してませんでした。
なのでFargateの場合、SSMのデータを読み込む場合は下記2択が想定されます。
- SSMのデータをdecryptして、task definition(container definition)に埋め込む
- 起動時にSSMのデータをdecryptして環境変数にセットする
1. task definitionに埋め込む場合
弊社もこちらでやってましたが、タスクの中に復号キーが載り(ECSのdescribe-tasks権限さえあれば)閲覧出来てしまうのでセキュアではありません。
ちなみに下記のmakefileで、すでに用意されてるcontainer definitionに対して、decryptしたデータに置換する処理をしてました。
$ vim ci.mk DATADOG_API_KEY := $(shell docker run --rm sioncojp/awscli aws ssm get-parameters --region ap-northeast-1 --name datadog_api_key --with-decryption | jq -r -e .Parameters[].Value) ecs/container_task_definition: ecs/clean @sed -i -e 's|@@API_KEY@@|$(DATADOG_API_KEY)|' container_task_definition.json ecs/clean: -rm -f container_task_definition.json
2. 起動時に環境変数にセットする場合
chamberというSSMを管理するツールで解決させました。
ロジックとしては、entrypoint.shを用意し、コンテナ起動時にchamberを使ってdecryptし、環境変数にセットしてます。
これでtask definitionにも復号キーが載らず、よりセキュアになります。
設定例
Fargateで、datadog-agentを立ち上げて外形監視させてる例を出してみました。
chamberのexportにはformatがjson/java-properties/csv/tsv/dotenvと用意されてます。
dotenv: DD_API_KEY="xxxxxxxx" java-properties: DD_API_KEY = xxxxxxx
今回は、java-propertiesで出力し、trコマンドで空白文字を削除して、 DD_API_KEY=xxxxxxx
として出力させ、それをexportして環境変数にセット。
最後のexecで、ベースとなるイメージが /init
を実行してるので、それを渡してます。
Dockerfile
$ vim Dockerfile FROM datadog/agent:latest ENV AWS_REGION ap-northeast-1 RUN curl -L -fsS --retry 2 -o /usr/local/bin/chamber https://github.com/segmentio/chamber/releases/download/v2.3.2/chamber-v2.3.2-linux-amd64 && \ chmod 755 /usr/local/bin/chamber COPY url.yaml /etc/datadog-agent/conf.d/http_check.d/url.yaml COPY fargate.yaml /etc/datadog-agent/conf.d/ecs_fargate.d/fargate.yaml COPY ./entrypoint.sh / RUN ["chmod", "+x", "/entrypoint.sh"] ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
$ vim entrypoint.sh #!/bin/sh - export $(chamber export --format java-properties fargate-datadog | tr -d ' ') exec /init
最後に
おそらくFargateのECSコンテナバージョンが1.22.0以上がサポートされれば、使えるかと思いますので、一時的な対応とはなりそうです。