LoginSignup
1
1

More than 3 years have passed since last update.

envsubstでDatadogのAPIキーをrun時にエントリポイントで差し替える

Last updated at Posted at 2019-07-11

gitにコミットしたくなかっただけの表記のとおりの備忘録です。

envsubstの単体動作はこんなかんじ。

# vi hoge.txt 
# cat hoge.txt
var1=${aaaa}
# export aaaa=hoge ;envsubst < hoge.txt > fuga.txt
# cat fuga.txt 
var1=hoge

こんなかんじにfluentdで行先を増やしたかったとして、
https://github.com/DataDog/fluent-plugin-datadog

+  <store>
+    @type datadog
+    @id awesome_agent
+    api_key '${DATADOG_APIKEY}'
+    include_tag_key true
+    tag_key 'tag'
+    dd_source 'ecs'
+    dd_tags 'logshipper:fluentd,ecstask:ecs-td-web-prod'
+    dd_sourcecategory 'ecs-td-web-prod'
+    host 'intake.logs.datadoghq.com'
+    ssl_port '10516'
+  </store>

APIキーっぽい変数はdocker runにあたるECSでいうとタスク定義の環境変数からエントリポイントかなにかで読みこんで反映させたいとする(docker buildにあたるCodebuildのbuildspec.ymlとかにかくビルド時だとコンテナに埋め込まれるのがアレな気がする)

とすると、fluentdコンテナのエントリポイントにあたるファイルがDockerfileでみると普通にかかれてたので(既存コンテナがあればdocker inspect container-idでもみられる)

# tail -3 Dockerfile 
ENTRYPOINT ["/bin/entrypoint.sh"]

CMD exec fluentd -c /fluentd/etc/${FLUENTD_CONF} -p /fluentd/plugins $FLUENTD_OPT

こんなかんじにエントリポイントのスクリプトを修正するとよさそう

# cat entrypoint.sh 
#!/usr/bin/dumb-init /bin/sh

export DATADOG_APIKEY=$DATADOG_APIKEY
envsubst < /tmp/conf/fluent.conf > /fluentd/etc/fluent.conf

uid=${FLUENT_UID:-1000}

# check if a old fluent user exists and delete it
cat /etc/passwd | grep fluent
if [ $? -eq 0 ]; then
    deluser fluent
fi

# (re)add the fluent user with $FLUENT_UID
adduser -D -g '' -u ${uid} -h /home/fluent fluent

# chown home and data folder
chown -R fluent /home/fluent
chown -R fluent /fluentd

exec su-exec fluent "$@"

ちなみに、このときのenvsubst の位置が大事で、chownしたあとにすると権限エラーでfluentdコンテナが起動しなくなりました。

あと、今回のfluentdコンテナのソースイメージがalpineなのでapkでgettextを入れとかないと(Dockerfileに追記しビルドしなおさないと)envsubstが居ないかんじでした。

RUN apk --no-cache add libintl && \
      apk --no-cache add --virtual .gettext gettext && \
      cp /usr/bin/envsubst /usr/local/bin/envsubst && \
      apk del .gettext

で、exportしてる変数をどこで指定するかというと、ローカルのテストでdockerコマンドつかってるならrun打つときに-e か--env-fileで指定、composeならymlにかけばよくて、ECSのタスク定義だったらコンテナ定義の環境変数のところにValueでじかにかくかValueFromでSystemManagerのSecretかなんかにいれたりしてそこからIAMロールの権限適切に定義してとってくる、という話でよさそうでした。

実際にさしかわったかどうかみるには以下のとおり。
(あとこの場合はログがとんできたかどうかなど)

# docker ps
# docker exec -it e12665df9414 grep api /fluentd/etc/fluent.conf
    api_key 58e401*******************2b67218

以上。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1