ECS Fargate で 169.254.169.254 が含まれるエラーが発生するときの対処法

2023.07.14

困っていた内容

自社アプリを Fargate に移行したところ Credentials 関係のエラーメッセージが発生します。
スタックトレースを確認するとインスタンスメタデータ(169.254.169.254)への接続に失敗しているようです。対処法を教えてください。

どう対応すればいいの?

アプリ内の認証情報の取得先をご確認ください。

ECS Fargate で IAM ロール(タスクロール)の認証情報は次の URL から取得する必要があり、EC2 の場合に取得する URL とは異なります。

AWS_CONTAINER_CREDENTIALS_RELATIVE_URIは環境変数であり、動的な値です。

## Fargate の場合
169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
# 例
169.254.170.2/v2/credentials/96574b15-39b9-41fb-b2ea-2362089cd242

## EC2 の場合
169.254.169.254/latest/meta-data/iam/security-credentials/

そのため、Fargate で169.254.169.254への接続が含まれる認証エラーが発生する場合は、アプリケーション内のコードで、認証情報を EC2 向けの URL から取得していないか確認し、必要に応じて修正してください。

なお、AWS SDK はAWS_CONTAINER_CREDENTIALS_RELATIVE_URIの有無によっては認証情報の取得先を切り替えているため、修正する際の選択肢としてAWS_CONTAINER_CREDENTIALS_RELATIVE_URIの有無で切り替える実装もご検討ください。

amazon-ecs-local-container-endpoints/features.md at mainline · awslabs/amazon-ecs-local-container-endpoints

If the variable exists, then the SDKs will try to obtain credentials by making requests to http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI.

またAWS_CONTAINER_CREDENTIALS_RELATIVE_URIが設定されるのは、コンテナ内の PID 1 プロセスのみで、複数のプロセスを実行している場合は、環境変数のエクスポートが必要になる場合があります。

Amazon ECS で「アクセス拒否」エラーを発生させないように IAM タスクロールを設定する | AWS re:Post

環境変数 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI を使用できるのは、コンテナ内の PID 1 プロセスのみです。コンテナで複数のプロセスまたは init プロセス (ラッパースクリプト、start スクリプト、supervisord など) を実行している場合、この環境変数を非 PID 1 プロセスで使用することはできません。

参考資料