この記事の対象とする方
コンテナにてcronサービスを起動しており、ECS on EC2では起動していたがFargateにすると起動しなくなる事象に遭遇している方。
エラー内容
AWS-SDK等でIAM ロール(タスクロール)の認証情報を取得しようとしたタイミングで以下のようなエラーが出力される。(Cloudwatch Logsに出力されるように設定していればそこを見に行く)
Error retrieving credentials from the instance profile metadata service.
(cURL error 7: Failed to connect to 169.254.169.254 port 80 after 0 ms: Couldn't connect to server (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)
for http://169.254.169.254/latest/meta-data/iam/security-credentials/
エラー原因
上記に記載の通り、
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
の環境変数がcronのサービス起動時に取得できていない。
この環境変数が取得できないためEC2用の
http://169.254.169.254/latest/meta-data/iam/security-credentials/
にリクエストを送ってしまっている。
対応方法
cronの環境変数に AWS_CONTAINER_CREDENTIALS_RELATIVE_URI を読み込ませる。
コード例
export-env
というファイルを作成し、以下のように記述する。
# docker-entrypoint.sh にて sed で置換する。
export AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=aws_container_credentials_relative_uri
Dockerfile にて コンテナ内にコピーする。
COPY ./export-env /usr/local/etc/export-env
docker-entrypoint.sh など起動時に、 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI の環境変数に設定されている内容を export-env のファイルに書き込む。
# cronにて読み込ませるための環境変数をexport-envに設定
sed -i "s@aws_container_credentials_relative_uri@$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI@g" /usr/local/etc/export-env
crontab など cron設定ファイルにて source /usr/local/etc/export-env で AWS_CONTAINER_CREDENTIALS_RELATIVE_URI の環境変数を設定する。
# source /usr/local/etc/export-env で 環境変数を読み込んだ後にcron実行したいコマンドを記載する
* * * * * source /usr/local/etc/export-env && /usr/local/bin/php /var/www/html/artisan inspire > /tmp/stdout 2>&1
参考資料