9 votes

La tâche Amazon ECS échoue avec STOPPED (CannotPullContainerError : Réponse d'erreur du daem)

J'ai mis en place un AWS VPC et j'essaie de déployer un conteneur fonctionnel dans ECS sur un Fargate launch type mais la tâche échoue toujours avec :

STOPPED (CannotPullContainerError: Error response from daem)

Le contexte du rôle de la tâche :

ecsTaskExecutionRole

Qui a les permissions IAM suivantes :

enter image description here

Les permissions du repo sont telles :

{
  "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"
      ]
    }
  ]
}

Pour des raisons de sécurité, l'identifiant réel est remplacé par aws_account_id

J'ai suivi ce guide sur le dépannage qui déclare :

Vous pouvez recevoir cette erreur en raison de l'un des problèmes suivants :

  • Votre type de lancement n'a pas accès au point de terminaison Amazon ECR.

    Je crois Fargate a accès à l'ECR

  • Votre politique de référentiel Amazon ECR restreint l'accès aux images du référentiel.

    Je crois qu'il permet pull access pour le rôle utilisé - voir les autorisations de repo ci-dessus.

  • Votre rôle AWS Identity and Access Management (IAM) ne dispose pas des autorisations nécessaires pour tirer ou pousser des images.

    Je pense qu'il a les permissions nécessaires - Voir le contexte du rôle de la tâche ci-dessus.

  • L'image ne peut pas être trouvée

    L'image est en ECR et les autorisations sont ci-dessus.

  • L'accès à Amazon Simple Storage Service (Amazon S3) est refusé par votre politique de point de terminaison de passerelle Amazon Virtual Private Cloud (Amazon VPC).

    Je le crois. L'autorisation IAM est définie comme ci-dessus S3 read access En outre, aucune politique explicite en matière de points de terminaison n'a été mise en place. selon les documents signifie un accès complet par défaut.

Pour tirer des images, Amazon ECS doit communiquer avec le point de terminaison Amazon ECR.

Table de routage définie dans le VPC :

enter image description here

avec tous les sous-réseaux du VPC associés. Ainsi, le VPC et tout ce qui s'y exécute devrait être en mesure de voir l'Internet - La politique de sécurité utilisée pour la tâche autorise actuellement tous les ports (temporaire lors du dépannage du problème ECR).

Qu'est-ce qui me manque pour que je reçoive encore cette erreur ?

Cela fonctionne en utilisant une instance EC2 - Si je crée une tâche qui utilise une instance EC2 avec toutes les autres choses étant égales (le cas échéant) SAUF

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

Le conteneur s'approvisionne et fonctionne - et l'application web qui fonctionne dans le conteneur s'exécute normalement. Mais dans Fargate, le mode réseau DOIT être awsvpc

Fargate only supports network mode ‘awsvpc’.

Je pense que c'est là que réside le problème, mais je ne sais pas comment faire pour remédier.

La définition de la tâche est la suivante :

{
  "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": []
}

1voto

Pavel Bernshtam Points 181

J'ai résolu ce problème en supprimant et en créant à nouveau le dépôt ECR.

0voto

Bryan Points 156

Essayez d'ajouter cette politique gérée par AWS : AmazonEC2ContainerServiceforEC2Role

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X