Sionの技術ブログ

SREとして日々の学習を書いて行きます。twitterは@sion_cojp

FargateでSSMのデータをコンテナ起動時に環境変数にセットする

はじめに

dev.classmethod.jp

こんな機能が提供されましたが、

(重要)Fargateは対応していない

本当かどうか実際に試したところ、やはり対応してませんでした。

なのでFargateの場合、SSMのデータを読み込む場合は下記2択が想定されます。

  1. SSMのデータをdecryptして、task definition(container definition)に埋め込む
  2. 起動時に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. 起動時に環境変数にセットする場合

github.com

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以上がサポートされれば、使えるかと思いますので、一時的な対応とはなりそうです。