AWS Fargate タスクの Amazon Elastic Container Service (Amazon ECS) で AWS ソフトウェア開発キット (AWS SDK) を使用したときに発生するメタデータエラーをトラブルシューティングしたいです。
簡単な説明
Fargate タスクに Amazon ECS の AWS SDK を使用するときに発生するメタデータエラーを、次のシナリオに基づいてトラブルシューティングします。
- Fargate タスクでインスタンスメタデータを取得できない。
- 設定に認証情報が不足しているか、認証情報を読み込めなかったというエラーが発生した。
- 断続的なメタデータエラー
- インスタンスメタデータサービスからタイムアウトエラーが発生した。
解決策
Fargate タスクでインスタンスメタデータを取得できない
Fargate タスクでインスタンスメタデータを取得できない場合は、次の手順を実行してください。
-
Amazon ECS Exec を使用してタスク内のコンテナにアクセスします。
注: お使いのものでそれぞれ、example-clustername をクラスター名、example-taskid を必要なタスク ID、example-containername をコンテナ名に置き換えます。
aws ecs execute-command --cluster $example-clustername \
--task $example-taskid \
--container $example-containername \
--interactive \
--command "/bin/sh"
-
次のようにメタデータを取得します。
プラットフォームバージョン 1.4.0 以降を使用する Fargate タスクの場合、タスクメタデータエンドポイントバージョン 4 を使用します。
curl ${ECS_CONTAINER_METADATA_URI_V4}/task
1.4.0 より前のプラットフォームバージョンを使用する Fargate タスクの場合、次のコマンドを使用します。
curl ${ECS_CONTAINER_METADATA_URI}/task
設定に認証情報が不足しているか、認証情報を読み込めなかったというエラーが発生した
次のエラーメッセージまたは同様のエラーメッセージが表示されていないか確認してください。
「設定に認証情報が不足しているか、どのプロバイダーからも認証情報を読み込めなかったか、トークンの取得に失敗しました」
このエラーは、タスク定義にタスクロールを追加せずに Fargate タスクを起動した場合に発生します。このエラーは、手動の RunTask API 操作でタスクロールのオーバーライドが指定されておらず、他の AWS 認証情報も指定されていない場合にも発生します。
このエラーを解決するには、次の手順を実行してください。
-
Amazon ECS Exec を使用してタスク内のコンテナにアクセスします。
注: お使いのものでそれぞれ、example-cluster-name をクラスター名、example-task-id を必要なタスク ID、example-container-name をコンテナ名に置き換えます。
aws ecs execute-command --cluster $example-cluster-name \
--task $example-task-id \
--container $example-container-name \
--interactive \
--command "/bin/sh"
-
タスクに関連付けられているタスクの AWS Identity and Access Management (IAM) ロールを確認します。
curl -s 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
出力例:
{
"RoleArn": "arn:aws:iam::ACCOUNT_ID:role/<task_role_name>",
"AccessKeyId": "XXXXXXXXXXXXXXXXX",
"SecretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"Token": "IQoJb......",
"Expiration": "2024-03-29T19:19:25Z"
}
注: Fargate タスクのタスク定義にタスクの IAM ロールがない場合は、404 page not found エラーが返されます。
-
AWS SDK が Fargate タスクアプリケーションコード内のコンテナメタデータの、デフォルトの認証情報プロバイダーチェーンを使用していることを確認してください。これにより、AWS_CONTAINER_CREDENTIALS_RELATIVE_URI システム環境変数から認証情報を読み込むことができます。
断続的なメタデータエラー
メタデータエンドポイントにアクセスしたときに断続的にメタデータエラーが発生する原因には、次のものが考えられます。
- 高い CPU やメモリ使用率などによるリソースの枯渇
- 同時に実行されているスレッドまたはプロセスの数が多い
- CPU スパイク
- アプリケーションで実行される集中的な操作が原因で、タスクのボリュームに高いディスク負荷がかかっている
- API 呼び出しを行うとコンテナ内でタスクメタデータサービスが頻繁にクエリされる
断続的に発生するメタデータエラーを解決するには、次の操作を行います。
- タスク定義で、適切な量の CPU とメモリ容量を使用して Fargate タスクを設定します。コンテナ化されたアプリケーションのメトリクスを追跡するように CloudWatch Container Insights を設定します。
- CloudWatch Container Insights と Amazon ECS タスクのメタデータエンドポイントを使用して、タスクストレージの使用状況を監視します。ディスク使用率をチェックして、増加させる必要があるかどうかを判断します。
- アプリケーションコードがタスクのメタデータサービスをクエリする頻度を減らします。たとえば、AWS オブジェクトを 1 回作成します。その後、アプリケーションコードで後続の API 呼び出しを行うときに、そのインスタンスを再利用します。
- 最新の AWS SDK バージョンを使用してください。AWS SDK の新しいバージョンでは、API コールを行うと、AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 環境変数から認証情報が自動的に取得されます。
インスタンスメタデータサービスからタイムアウトエラーが発生した
インスタンスメタデータサービスでタイムアウトエラーが発生した場合は、アプリケーションコードで定義されているタイムアウトしきい値を超えています。これは、CPU やメモリが不足しているためにメタデータサービスのリクエストがキューに入っている場合や、実行中のプロセスの数が多い場合に発生します。
このエラーを解決するには、次の手順を実行します。
- アプリケーションコードで定義されているタイムアウトを確認します。インスタンスメタデータサービスのタイムアウト値が適切であることを確認します。
- 認証情報を取得するために、再試行を実装します。メタデータサービスを呼び出す頻度も減らします。
- タスク定義で適切な量の CPU とメモリを使用して Fargate タスクを設定します。
関連情報
Amazon ECS タスクの ロール