Amazon ECS の「シークレットまたはレジストリ認証を取得できません」というエラーをトラブルシューティングする方法を教えてください。

所要時間3分
0

Amazon Elastic Container Service (Amazon ECS) タスクを起動したときに、次のいずれかのエラーが表示されました。 「ResourceInitializationError: シークレットまたはレジストリ認証を取得できません:プルコマンドが失敗しました:: signal: kill」または「ResourceInitializationError: シークレットまたはレジストリ認証をプルできません:実行リソースの取得に失敗しました:asm からシークレットを取得できません:サービスコールが再試行されました。」

簡単な説明

AWS Fargate プラットフォームバージョン 1.4.0 では、タスクの Elastic Network Interface を使用してイメージとシークレットを取得します。すべてのネットワークトラフィックは、Amazon Virtual Private Cloud (Amazon VPC) 内の Elastic Network Interface を経由します。このトラフィックは Amazon VPC フローログで確認できます。ただし、このタスクでは、Fargate が所有する Elastic Network Interface ではなく、ユーザーのネットワーク設定を使用します。これは、Elastic Network Interface が Amazon VPC 内に配置されているためです。

Amazon ECS コンテナエージェントは、タスク実行 AWS ID および Access Management (IAM) ロール を使用して、以下のサービスから情報を取得します。

  • AWS Systems Manager Parameter Store
  • AWS Secrets Manager

顧客管理の AWS Key Management Service (AWS KMS) キーを使用してデータを暗号化する場合は、タスク実行 IAM ロールに次の権限を付与します。

  • ssm:GetParameters
  • secretsmanager:GetSecretValue
  • kms:Decrypt

起動に失敗する Amazon ECS タスクをトラブルシューティングするには、AWSSupport-TroubleshootECSTaskFailedToStart ランブックを使用してください。このオートメーションでは以下の構成を確認します。

  • 設定したコンテナレジストリへのネットワーク接続
  • タスク実行ロールに必要な IAM 権限がない
  • 仮想プライベートクラウド (VPC) エンドポイント接続
  • セキュリティグループルール設定
  • AWS Secrets Manager のシークレットリファレンス
  • ロギング設定

ランブックの出力に推奨事項が記載されていない場合は、次のセクションにある手動によるトラブルシューティング方法を使用してください。

解決策

重要:

  • ECS クラスターリソースが配置されているのと同じ AWS リージョンでランブックを使用してください。
  • ランブックを使用するときは、最近失敗したタスク ID を使用する必要があります。失敗したタスクが Amazon ECS サービスの一部である場合は、サービス内で最後に失敗したタスクを使用してください。失敗したタスクは、オートメーションの実行中に ECS:DescribeTasks に表示される必要があります。デフォルトでは、停止した ECS タスクは、停止状態になってから 1 時間表示されます。最近失敗したタスク ID を使用すると、タスク状態のクリーンアップによってオートメーション中に分析が中断されるのを防ぐことができます。

AWSSupport-TroubleshootECSTaskFailedToStart ランブックを実行するには、次の手順を実行します。

  1. AWS Systems Manager コンソールを開きます。
  2. ナビゲーションペインで、[変更管理] から [オートメーション] を選択します。
  3. [オートメーションの実行] を選択します。
  4. [Amazon が所有] タブを選択します。
  5. [オートメーションドキュメント] で「TroubleshootECSTaskFailedToStart」を検索します。
  6. AWSSupport-TroubleshootECSTaskFailedToStart カードを選択します。
    **注:**ハイパーリンクされたオートメーション名ではなく、カード上のラジオボタンを選択します。
  7. [次へ] を選択します。
    注:実行後、分析結果はグローバル出力セクションに入力されます。ただし、ドキュメントのステータスが [成功] に移行するまでお待ちください。また、[出力] セクションに例外がないかどうかも確認してください。
  8. [オートメーションドキュメントを実行] で、[シンプルな実行] を選択します。
  9. [入力パラメーター] セクションの [AutomationAssumeRole] に、システムマネージャーオートメーションがアクションを実行できるようにするロールの ARN を入力します。
    **注:**AutomationAssumeRole または IAM ユーザーまたはロールのいずれかに、AWSSupport-TroubleshootECSTaskFailedToStart ランブックを実行するために IAM に必要な権限があることを確認してください。IAM ロールを指定しない場合、Systems Manager オートメーションは IAM ユーザーまたはランブックを実行するロールの権限を使用します。Systems Manager オートメーションの assume ロールの作成については、「タスク 1: オートメーション用のサービスロールを作成する」を参照してください。
  10. [ClusterName] には、タスクを開始できなかったクラスター名を入力します。
  11. [TaskId] には、最近失敗したタスクの ID を入力します。
  12. [実行] を選択します。

オートメーションの出力に基づいて、次のいずれかの手動トラブルシューティング手順を実行します。

サブネットからインターネットへのルートを確認する

パブリックサブネットに Fargate タスクがある場合は、そのタスクにパブリック IP アドレスが割り当てられていることを確認します。また、タスクにインターネットゲートウェイへのデフォルトルート (0.0.0.0/0) が設定されていることを確認します。新しいタスクを起動したり、新しいサービスを作成したりするときは、[パブリックの自動割り当て] をオンにしてください。

以下の構成を使用する場合は、パブリックサブネットのインターネットゲートウェイを使用して Secrets Manager または Systems Manager にアクセスしないでください。代わりに、Amazon VPC エンドポイントを使用してください。

  • Secrets Manager または Systems Manager の VPC エンドポイントはパブリックサブネットにあります。
  • Amazon VPC の DHCP 設定で AmazonProvidedDNS を有効にしました。

**注:**既存のタスクに対して パブリックの自動割り当て を有効にすることはできません。既存のサービスの場合、サービスの再構成に使用できるのは AWS コマンドラインインターフェイス (AWS CLI) だけです。AWS マネジメントコンソールは使用できません。AWS CloudFormation スタックを使用して Amazon ECS サービスを作成した場合は、NetworkConfiguration プロパティ AWS::ECS::Service を変更してサービスを更新してください。

プライベートサブネットに Fargate タスクがある場合は、そのタスクにインターネット接続ソースへのデフォルトルート (0.0.0.0/0) があることを確認してください。インターネット接続ソースには、NAT ゲートウェイ、AWS PrivateLink、またはその他のソースを使用できます。

  • NAT ゲートウェイを使用する場合は、NAT ゲートウェイをパブリックサブネットに配置します。詳細については、インターネットゲートウェイと NAT ゲートウェイを備えたアーキテクチャ を参照してください。
  • PrivateLink を使用する場合は、Fargate インフラストラクチャが Amazon VPC エンドポイント のセキュリティグループを使用できることを確認してください。
  • カスタムネームドメインサーバーを使用する場合は、DNS クエリの設定を確認してください。クエリには、UDP プロトコルと TCP プロトコルを使用してポート 53 でアウトバウンドアクセスする必要があります。また、ポート 443 で HTTPS にアクセスできる必要があります。

ネットワーク ACL とセキュリティグループの設定を確認する

ネットワークアクセスコントロールリスト (ネットワーク ACL) とセキュリティグループが、サブネットからのポート 443 へのアウトバウンドアクセスをブロックしていないことを確認します。詳細については、「セキュリティグループを使用してリソースへのトラフィックを制御する」を参照してください。

**注:**送信トラフィックを許可し、Amazon ECS エンドポイントにアクセスするには、Fargate タスクにポート 443 へのアウトバウンドアクセス権が必要です。

Amazon VPC エンドポイントを確認する

PrivateLink を使用する場合は、必要なエンドポイントを作成する必要があります。

Fargate プラットフォームバージョン 1.4.0 以降には、次のエンドポイントが必要です。

  • com.amazonaws.region.ecr.dkr
  • com.amazonaws.region.ecr.api
  • S3 ゲートウェイエンドポイント
  • com.amazonaws.region.logs

詳細については、「Amazon ECR VPC エンドポイントに関する考慮事項」を参照してください。

: タスク定義でシークレットマネージャ、システムマネージャパラメータ、または Amazon CloudWatch Logs を使用している場合は、エンドポイントの定義が必要になることがあります。詳細については、次のドキュメントを参照してください。

PrivateLink を使用する場合は、Amazon VPC のセキュリティグループが正しいトラフィックを許可していることを確認してください。グループは、TCP ポート 443 で Fargate タスクセキュリティグループまたは Fargate タスク VPC CIDR 範囲からのトラフィックを許可する必要があります。

Fargate インフラストラクチャにサービスアクセスがあることを確認するには、VPC エンドポイントポリシーAmazon Simple Storage Solution (Amazon S3) の エンドポイントポリシーを確認してください。

IAM ロールと権限を確認する

タスク実行ロールは、Amazon ECS コンテナと Fargate エージェントにタスクの API 呼び出しを行うために必要な権限を付与します。Fargate では、次のアクションを実行するときにこのロールが必要になります。

  • Amazon Elastic Container Registry (Amazon ECR) からコンテナイメージを取得する。
  • awslogs ログドライバーを使用する。
  • プライベートレジストリ認証を使用する。
  • 機密データを参照するには、Secrets Manager シークレットまたは Systems Manager Parameter Store パラメータを使用します。

ユースケースに前述のシナリオのいずれかが含まれる場合は、タスク実行ロールで必要な権限を定義します。必要な権限の詳細なリストについては、「Amazon ECS タスク実行 IAM ロール」を参照してください。

Amazon ECS タスク定義で参照されている機密情報を確認する

シークレット名とパラメータ名が Amazon ECS タスク定義の参照名と一致するか確認します。次に、タスク定義のコンテナ定義の値が Amazon ECS タスク定義の値と一致するか確認します。詳細については、「Amazon ECS タスクでシークレットや機密情報をコンテナに安全に渡すにはどうすればよいですか?」を参照してください。

Systems Manager Parameter Store パラメータとタスクが同じリージョンにある場合は、完全な ARN またはシークレットの名前を使用してください。パラメータが別のリージョンに存在する場合は、完全な ARN を指定する必要があります。

Systems Manager のパラメータ名と ARN を確認するには、次の手順を実行してください。

注: AWS CLI コマンドの実行中にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください。

  1. AWS Systems Manager コンソールを開きます。
  2. ナビゲーションペインで [パラメータストア] を選択し、[パラメータストア名] を確認します。
  3. パラメータの ARN を取得するには、AWS CLI を使用して次のコマンドを実行します。name_of_parameter_store_secret を Parameter Store のシークレット名に置き換えます。
$ aws ssm get-parameter —name <name_of_parameter_store_secret> —with-decryption

**注:**Secrets Manager シークレットを参照するパラメータは、パラメータストアのバージョン管理機能や履歴機能を使用できません。詳細については、「制限事項」を参照してください。

関連情報

停止したタスクのエラーの確認

AWS公式
AWS公式更新しました 1年前
コメントはありません