web-dev-qa-db-ja.com

Amazon ECSタスクがSTOPPEDで失敗する(CannotPullContainerError:daemからのエラー応答)

AWS VPCを設定し、Fargate launch typeECSに機能コンテナーをデプロイしようとしていますが、タスクは常に次のように失敗します:

STOPPED (CannotPullContainerError: Error response from daem)

タスクの役割のコンテキスト:

ecsTaskExecutionRole

次のIAM権限があります。

enter image description here

リポジトリの権限は次のとおりです。

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "AllowPull",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole"
      },
      "Action": [
        "ecr:BatchCheckLayerAvailability",
        "ecr:BatchGetImage",
        "ecr:DescribeImages",
        "ecr:DescribeRepositories",
        "ecr:GetAuthorizationToken",
        "ecr:GetDownloadUrlForLayer",
        "ecr:GetRepositoryPolicy",
        "ecr:ListImages"
      ]
    }
  ]
}

セキュリティのため、実際のIDはaws_account_idに置き換えられます

次のようなトラブルシューティングについて このガイド に従いました:

このエラーは、次のいずれかの問題が原因で発生する可能性があります。

  • 起動タイプにはAmazon ECRエンドポイントへのアクセス権がありません

    私は信じています ファーゲートはECRにアクセスできます

  • Amazon ECRリポジトリポリシーにより、リポジトリイメージへのアクセスが制限されます

    私はそれが使用されるロールに対してpull accessを許可すると信じています-上記のリポジトリのパーミッションを参照してください。

  • AWS Identity and Access Management(IAM)ロールには、イメージをプルまたはプッシュするための適切なアクセス許可がありません

    必要な権限があると思います-上記のタスクロールのコンテキストを参照してください。

  • 画像が見つかりません

    画像はECRにあり、権限は上記のとおりです

  • Amazon Simple Storage Service(Amazon S3)アクセスは、Amazon Virtual Private Cloud(Amazon VPC)ゲートウェイエンドポイントポリシーによって拒否されます

    私はそう信じています。 IAM権限は上記のS3 read accessに従って設定されています。さらに、明示的なエンドポイントポリシーは設定されていません。つまり、 ドキュメントに従って は、デフォルトでフルアクセスを意味します。

イメージをプルするには、Amazon ECSがAmazon ECRエンドポイントと通信する必要があります。

VPCで定義されたルーティングテーブル:

enter image description here

vPCのすべてのサブネットが関連付けられています。したがって、VPCとその中で実行されているものはすべてインターネットを見ることができるはずです-タスクに使用されるセキュリティポリシーは現在すべてのポートを許可しています(ECR問題のトラブルシューティング中の一時)。

まだこのエラーが発生しているのに何が欠けていますか?

これはEC2インスタンスを使用して機能します-EC2インスタンスを使用するタスクを作成し、他のすべてのものが等しい場合(該当する場合)EXCEPT

EC2:  Network Mode = Bridge 
Fargate: Network Mode = awsvpc

コンテナーがプロビジョニングおよび実行され、コンテナーで実行されるWebアプリが正常に実行されます。ただし、Fargateでは、ネットワークモードはawsvpcである必要があります。

Fargate only supports network mode ‘awsvpc’.

これは問題が存在する場所だと思いますが、どのように対処すればよいかわかりません。

タスク定義は次のとおりです:

{
  "ipcMode": null,
  "executionRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole",
  "containerDefinitions": [
    {
      "dnsSearchDomains": null,
      "logConfiguration": {
        "logDriver": "awslogs",
        "secretOptions": null,
        "options": {
          "awslogs-group": "/ecs/deploy-test-web",
          "awslogs-region": "us-west-2",
          "awslogs-stream-prefix": "ecs"
        }
      },
      "entryPoint": [],
      "portMappings": [
        {
          "hostPort": 8080,
          "protocol": "tcp",
          "containerPort": 8080
        }
      ],
      "command": null,
      "linuxParameters": null,
      "cpu": 1,
      "environment": [],
      "resourceRequirements": null,
      "ulimits": null,
      "dnsServers": null,
      "mountPoints": [],
      "workingDirectory": null,
      "secrets": null,
      "dockerSecurityOptions": null,
      "memory": null,
      "memoryReservation": null,
      "volumesFrom": [],
      "stopTimeout": null,
      "image": "csrepo/test-web-v4.0.6",
      "startTimeout": null,
      "dependsOn": null,
      "disableNetworking": null,
      "interactive": null,
      "healthCheck": null,
      "essential": true,
      "links": null,
      "hostname": null,
      "extraHosts": null,
      "pseudoTerminal": null,
      "user": null,
      "readonlyRootFilesystem": null,
      "dockerLabels": null,
      "systemControls": null,
      "privileged": null,
      "name": "test-web-six"
    }
  ],
  "placementConstraints": [],
  "memory": "2048",
  "taskRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole",
  "compatibilities": [
    "EC2",
    "FARGATE"
  ],
  "taskDefinitionArn": "arn:aws:ecs:us-west-2:aws_account_id:task-definition/deploy-test-web3:4",
  "family": "deploy-test-web3",
  "requiresAttributes": [
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
    },
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "ecs.capability.execution-role-awslogs"
    },
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
    },
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "ecs.capability.private-registry-authentication.secretsmanager"
    },
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "com.amazonaws.ecs.capability.task-iam-role"
    },
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
    },
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "ecs.capability.task-eni"
    }
  ],
  "pidMode": null,
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "networkMode": "awsvpc",
  "cpu": "1024",
  "revision": 4,
  "status": "ACTIVE",
  "inferenceAccelerators": null,
  "proxyConfiguration": null,
  "volumes": []
}
4
Roy Hinkley

ECRリポジトリを削除して再作成することでこの問題を解決しました

1
Pavel Bernshtam

このAWS管理ポリシーを追加してみてください:AmazonEC2ContainerServiceforEC2Role

0
Bryan