FargateのApacheコンテナの環境変数デバッグ方法
やること
こんにちは。大阪オフィスのかずえです。
Fargate、使ってますか?ホストインスタンスの管理をAWSにまるっとお任せできるので楽ですが、docker execでホストインスタンスに入ってゴニョゴニョすることができないので、デバッグが少し大変だったりします。
【祝!】FargateでもECSにごっつ簡単に環境変数に機密情報を渡せるようになりました!
上記エントリにもある通り、Fargateでも環境変数の参照元としてパラメータストアを簡単に使えるようになっております。SecureStringタイプを使えば機密情報も登録可能です。簡単&便利なので皆さんご利用されることをオススメします。
今回は、この環境変数がちゃんと登録できているかコンテナ内で確認したい、という話です。 docker execが使えれば楽なのですが、Fargateなので使えません。前述のエントリではPHPを使っての確認方法が紹介されています。しかし、です。全てのコンテナでphpやruby等が使えるわけではありません。「Apacheコンテナ、ワイはどうすればええんや。。」ということでApacheコンテナでの環境変数値の確認方法をご紹介します。
方針
Apacheではアクセスログに環境変数値を出力することができます。アクセスログを標準出力に出力し、それをCloudWatch Logsに転送し確認します。
具体的な手順
今回は APACHE_ENV_TEST1
とAPACHE_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_TEST1
にlocal
、APACHE_ENV_TEST2
にdayo
を定義しています。
$ 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/ にアクセス
コンソールにアクセスログが表示されます。 各行末尾に環境変数値が出力されているのが確認できます。
タスク定義で環境変数を設定
ECRにイメージをプッシュした後、タスク定義でそのイメージを使用します。
コンテナの編集の環境変数欄にて、環境変数を定義します。
APACHE_ENV_TEST1
にfargate
、APACHE_ENV_TEST2
にyade
を定義しています。
上記はパラメータストアを使わないやり方です。パラメータストアを利用する方法は、環境変数値を確認するという本エントリ内容とは直接関係ないので割愛しました。 パラメータストアを利用する場合はこちらなどを参考にしてみてください。
また、ログドライバーでawslogsが設定されていることも確認しておきましょう。
CloudWatch Logsで確認
各行末尾に先ほどタスク定義で指定した環境変数値が記録されています。
終わりに
Apacheコンテナでの環境変数のご確認にご利用ください!