AWS Secrets Manager のシークレットを使用するタスクを Amazon Elastic Container Service (Amazon ECS) に配置しようとすると、エラーメッセージが表示されます。
簡単な説明
Secrets Manager のシークレットを含むタスクを Amazon ECS に配置しないと、次のいずれかのエラーメッセージが表示されることがあります。
"ResourceInitializationError error on AWS Fargate AccessDenied error on Amazon Elastic Compute Cloud (Amazon EC2)"
"The task is unable to retrieve secrets from Secrets Manager and fails."
"ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve secret from asm: service call has been retried 1 time(s): failed to fetch secret"
"AccessDeniedException: User: arn:aws:sts::XXXXXXXX:assumed-role/test-ecs-execution-role-no-secrets/XXXXXXXXXXX is not authorized to perform:"
これらのエラーメッセージは、次のいずれかの理由で発生します。
- Amazon ECS タスク実行ロールに、Secrets Manager のシークレットにアクセスするのに必要なアクセス許可がない。
- Secrets Manager が指定されたシークレットを見つけることができない。
- シークレットの名前がハイフンとそれに続く 6 文字で終わっており、Amazon リソースネーム (ARN) の一部を使用してシークレットを検索している。
- Amazon Virtual Private Cloud (Amazon VPC) のネットワーク設定に問題がある。
Amazon ECS タスクの起動に失敗するエラーをトラブルシューティングするには、AWSSupport-TroubleshootECSTaskFailedToStart ランブックを使用します。次に、問題に関連するトラブルシューティングの手順を参照してください。
解決策
前提条件: AWS Identity and Access Management (IAM) ユーザーまたはロールに、ランブックの使用に必要なアクセス許可があることを確認してください。詳細については、AWSSupport-TroubleshootECSTaskFailedToStart の「Required IAM permissions」(必要な IAM アクセス許可) セクションを参照してください。
Amazon ECS クラスターのリソースが配置されたリージョンと同じ AWS リージョンで、AWSSupport-TroubleshootECSTaskFailedToStart ランブックを使用します。
最後に失敗したタスクの ID を使用してください。失敗したタスクが Amazon ECS サービスに属している場合は、サービス内で最後に失敗したタスクを使用してください。失敗したタスクは、オートメーションの実行中に ECS:DescribeTasks に表示されるはずです。デフォルトでは、停止した Amazon ECS タスクは、停止状態になってから 1 時間表示されます。
AWS Systems Manager ランブックを実行する
次の手順を実行します。
- Systems Manager コンソールを開きます。
- ナビゲーションペインで [ドキュメント] をクリックします。
- 検索バーに TroubleshootECSTaskFailedToStart と入力します。
- AWSSupport-TroubleshootECSTaskFailedToStart ドキュメントを選択します。
- [オートメーションの実行] を選択します。
- [実行] をクリックします。
- オートメーションが完了したら、[出力] セクションで詳細な結果を確認し、次の手動トラブルシューティング手順のいずれかを実行してください。
Amazon ECS タスク実行ロールのアクセス許可を確認する
次の手順を実行します。
- IAM コンソールを開きます。
- ナビゲーションペインで [ロール] をクリックします。
- ロールのリストから、Amazon ECS タスクが使用しているタスク実行ロールを検索します。
- タスク実行ロールに、Secrets Manager リソースへのアクセスに必要なアクセス許可を付与したことを確認します。
Secrets Manager のシークレットが存在することを確認する
次の手順を実行します。
- Secrets Manager コンソールを開きます。
- ナビゲーションペインで [シークレット] をクリックし、Amazon ECS タスクが使用するシークレットを選択します。
- Amazon ECS タスク定義にこれらの特定のシークレット名が含まれていることを確認します。シークレットに追加のパラメータを指定した場合は、タスク定義にシークレットで指定されている json-key/version-stage/version-id が含まれていることを確認します。
Secrets Manager シークレットの名前と ARN を確認する
シークレット名がハイフンとそれに続く 6 文字で終わっていないか確認してください。例えば、myappsecret-xxxxxx などです。Secrets Manager は、ARN の末尾にあるシークレット名の後にハイフンと 6 つのランダムな文字を自動的に追加します。シークレット名の末尾には、ハイフンとそれに続く 6 文字を使用しないことをお勧めします。
この問題を解決するには、Secrets Manager のシークレットの完全な ARN (追加のハイフンと 6 文字を含む) を使用してください。
Amazon VPC のネットワーク設定を確認する
次の条件に当てはまる場合は、Secrets Manager のインターフェイス Amazon VPC エンドポイントを作成します。
- Secrets Manager のシークレットを参照してコンテナの機密データを取得するタスク定義を使用している。
- インターフェイス Amazon VPC エンドポイントを使用している。
また、Amazon VPC エンドポイントのセキュリティグループが Amazon ECS インフラストラクチャにエンドポイントの使用を許可していることを確認してください。
Secrets Manager の Amazon VPC エンドポイントが存在するかどうかを確認するには、以下の手順を実行します。
- Amazon VPC コンソールを開きます。
- ナビゲーションペインで [エンドポイント] をクリックします。
- Secrets Manager の Amazon VPC エンドポイント com.amazonaws.example-region.secretsmanager を指定していることを確認します。
- 該当のエンドポイントを選択し、[サブネット] タブをクリックします。このエンドポイントのサブネットに、Amazon ECS タスクが使用するエンドポイントが含まれていることを確認します。
注: サブネットがない場合は、[サブネットの管理] をクリックします。アベイラビリティーゾーンに基づいてサブネットを選択し、次に [サブネットの変更] をクリックします。
エンドポイント com.amazonaws.example-region.secretsmanager にアタッチされたセキュリティグループが Amazon ECS タスクからのポート 443 での受信接続を許可していることを確認するには、次の手順を実行します。
- Amazon VPC コンソールを開きます。
- ナビゲーションペインで [エンドポイント] をクリックします。
- 該当のエンドポイントを選択します。
- [セキュリティグループ] タブをクリックします。
- 確認するセキュリティグループのグループ ID を選択します。
- [インバウンドルール] タブをクリックします。
- インバウンドルールのリストに、Amazon ECS タスクからの 443 接続を許可するルールが含まれていることを確認します。
関連情報
Amazon ECS タスクにおいて、シークレットや機密情報をコンテナに安全に渡す方法を教えてください。
Troubleshooting AWS Secrets Manager (AWS Secrets Manager のトラブルシューティング)