本記事は、AWS Containers Advent Calendar 2023 の 13 日目 (12/13) のエントリーです。
本エントリーでは、Amazon Elastic Container Service (Amazon ECS) でタスクに IAM ロールを割り当てる機能である「タスク IAM ロール」を利用する際の Tips をご紹介します。
タスク IAM ロールとは
タスク IAM ロールとは、文字通り「ECS タスクごとに IAM ロールを割り当てる」機能です。全体的な動作イメージは次の図のようになります。
(下記は ECS on EC2 を想定していますが、ECS on Fargate の場合も (2) 以降は同じような流れになります)
- ecs-agent がコンテナインスタンスにアタッチされた IAM ロール (インスタンスプロファイル) の一時認証情報を取得
- 1 で取得した一時認証情報を利用して、ECS タスクに紐付け予定の「IAM ロールの一時認証情報」を取得
- 2 で取得した「IAM ロールの一時認証情報」を取得するための secret を付与して ECS タスクを実行
- ECS タスクで動くアプリケーションが、3 の secret を利用して「IAM ロールの一時認証情報」を取得
参考: Using IAM roles with Amazon ECS tasks - Amazon Elastic Container Service
ここでポイントとなるのは、ECS タスクで動くアプリケーションが「IAM ロールの一時認証情報」を取得する場合、ecs-agent に対してリクエストが発生するという点です。
タスクメタデータエンドポイントには rate limit がある
ecs-agent は、タスクメタデータエンドポイントで「IAM ロールの一時認証情報」を提供しています。タスクメタデータエンドポイントには rate limit が設けられており、一定期間中に大量のリクエストを送るとスロットリングが発生します。
つまり、アプリケーションが「IAM ロールの一時認証情報」を頻繁に行うようなケースでは、タスクメタデータエンドポイントへのリクエストでスロットリングが発生し、一時認証情報を取得できない場合がでてきます。本事象については、ecs-agent のタスクメタデータエンドポイントの rate limit の設定値を変更することで緩和できる場合があります。
タスク用の IAM ロールのトラブルシューティング - Amazon Elastic Container Service
「Unable to locate credentials」エラーが表示された場合、次の原因が考えられます。
(中略)
・ 認証情報の URL が調整されています。ECS_TASK_METADATA_RPS_LIMIT コンテナエージェントパラメータを使用して、スロットル制限を設定できます。詳細については、「Amazon ECS コンテナエージェントの設定」を参照してください。
ただし、ECS_TASK_METADATA_RPS_LIMIT
の調整でも緩和できない場合や、ECS_TASK_METADATA_RPS_LIMIT
パラメーターを変更できない ECS on Fargate 環境の場合は、どのように対処すればよいでしょうか。
この場合、アプリケーション側のコードを見直すことで改善できる場合があります。アプリケーションコードをどのように見直すのかについては、本エントリーの後編をお待ちください!