FargateのApacheコンテナの環境変数デバッグ方法

やること

こんにちは。大阪オフィスのかずえです。

Fargate、使ってますか?ホストインスタンスの管理をAWSにまるっとお任せできるので楽ですが、docker execでホストインスタンスに入ってゴニョゴニョすることができないので、デバッグが少し大変だったりします。

【祝!】FargateでもECSにごっつ簡単に環境変数に機密情報を渡せるようになりました!

上記エントリにもある通り、Fargateでも環境変数の参照元としてパラメータストアを簡単に使えるようになっております。SecureStringタイプを使えば機密情報も登録可能です。簡単&便利なので皆さんご利用されることをオススメします。

今回は、この環境変数がちゃんと登録できているかコンテナ内で確認したい、という話です。
docker execが使えれば楽なのですが、Fargateなので使えません。前述のエントリではPHPを使っての確認方法が紹介されています。しかし、です。全てのコンテナでphpやruby等が使えるわけではありません。「Apacheコンテナ、ワイはどうすればええんや。。」ということでApacheコンテナでの環境変数値の確認方法をご紹介します。

方針

Apacheではアクセスログに環境変数値を出力することができます。アクセスログを標準出力に出力し、それをCloudWatch Logsに転送し確認します。

具体的な手順

今回は APACHE_ENV_TEST1APACHE_ENV_TEST2という環境変数の中身を確認することとします。

デフォルトのconfファイルの取得

まずは素のApacheからデフォルトのconfファイルを取得します。

$ docker run -d --name plain-httpd httpd
$ docker cp plain-httpd:/usr/local/apache2/conf/httpd.conf ./

httpd.confの編集

デフォルトから3個所変更します。

Apacheの設定ファイル内で PassEnv (変数名) を記述

PassEnv ディレクティブを使います。

複数個の変数を記述する場合は、変数名の間に半角スペースを入れます。

 <IfModule log_config_module>
+    PassEnv APACHE_ENV_TEST1 APACHE_ENV_TEST2
     #
     # The following directives define some format nicknames for use with
     # a CustomLog directive (see below).
     #
     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
     LogFormat "%h %l %u %t \"%r\" %>s %b" common

%{(環境変数名)}e が含まれたLogFormat作成

LogFormatディレクティブ内で%{(環境変数名)}eと書くと、その位置に環境変数値を埋め込むことができます。

(参考)カスタムログ書式

     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
     LogFormat "%h %l %u %t \"%r\" %>s %b" common
+    LogFormat "%h %l %u %t \"%r\" %>s %b %{APACHE_ENV_TEST1}e %{APACHE_ENV_TEST2}e" common-plus-env

CustomLogディレクティブで上記LogFormat使う

上記LogFormatを使うように設定します。

     #
     # The location and format of the access logfile (Common Logfile Format).
     # If you do not define any access logfiles within a <VirtualHost>
     # container, they will be logged here.  Contrariwise, if you *do*
     # define per-<VirtualHost> access logfiles, transactions will be
     # logged therein and *not* in this file.
     #
+    CustomLog /proc/self/fd/1 common-plus-env
-    CustomLog /proc/self/fd/1 common
 

Dockerfileの作成

FROM httpd
COPY ./httpd.conf /usr/local/apache2/conf/httpd.conf

Dockerfileと同階層に先ほど編集したconfファイルを置いて下さい。

ローカルでデバッグ

イメージのビルド

$ docker image build . -t apache-env-test

コンテナ作成

-eで環境変数を宣言できます。
APACHE_ENV_TEST1localAPACHE_ENV_TEST2dayoを定義しています。

$ docker run -p 8080:80 --name apache-env-test-container -e APACHE_ENV_TEST1=local -e APACHE_ENV_TEST2=dayo apache-env-test

ブラウザで http://localhost:8080/ にアクセス

コンソールにアクセスログが表示されます。
各行末尾に環境変数値が出力されているのが確認できます。 Dockerコンテナのアクセスログに環境変数値が出力されています

タスク定義で環境変数を設定

ECRにイメージをプッシュした後、タスク定義でそのイメージを使用します。
コンテナの編集の環境変数欄にて、環境変数を定義します。 APACHE_ENV_TEST1fargateAPACHE_ENV_TEST2yadeを定義しています。 コンテナの編集の環境変数欄にて、環境変数を定義

上記はパラメータストアを使わないやり方です。パラメータストアを利用する方法は、環境変数値を確認するという本エントリ内容とは直接関係ないので割愛しました。
パラメータストアを利用する場合はこちらなどを参考にしてみてください。

また、ログドライバーでawslogsが設定されていることも確認しておきましょう。

CloudWatch Logsで確認

各行末尾に先ほどタスク定義で指定した環境変数値が記録されています。 CloudWatch Logsで環境変数値を確認

終わりに

Apacheコンテナでの環境変数のご確認にご利用ください!