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