Gia*_*eri 5 amazon-web-services amazon-ecs aws-cli
在我的 CI 上,我已经通过 bash 脚本在 AWS ECS 环境中配置了部署
**deploy.sh**
[...]
aws ecs register-task-definition --cli-input-json file://./deploy/skeleton.json
TASK_DEFINITION_ARN=$(aws ecs --output text list-task-definitions --family-prefix "${PROJECT_NAME}" --sort DESC --query "taskDefinitionArns[0]")
aws ecs update-service \
--cluster "${PROJECT_NAME}" \
--service "${PROJECT_NAME}" \
--task-definition "${TASK_DEFINITION_ARN}" \
--force-new-deployment \
--deployment-configuration "maximumPercent=200,minimumHealthyPercent=100" \
--desired-count ${DESIRED_COUNT}
[...]
Run Code Online (Sandbox Code Playgroud)
和
**skeleton.json**
{
"family": "backend",
"executionRoleArn": "arn:aws:iam::000000000000:role/XXXX",
"taskRoleArn": "arn:aws:iam::0000000:role/XXXX",
"networkMode": "awsvpc",
"containerDefinitions":
[{
"name": "csharp",
"essential": true,
"environment":[{
"name" : "CONNECTIONSTRINGS__Redis",
"value" : "XXXX"
},
{
"name" : "CONNECTIONSTRINGS__Database",
"value" : "XXX"
},
{
"name" : "ASPNETCORE_ENVIRONMENT",
"value" : "XXX"
}],
"image": "00000000.dkr.ecr.eu-west-1.amazonaws.com/prj/backend:643105ef",
"portMappings": [
{
"containerPort": 80,
"protocol": "tcp"
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/backend/",
"awslogs-region": "eu-west-1",
"awslogs-stream-prefix": "csharp"
}
}
}],
"requiresCompatibilities": [
"FARGATE"
],
"cpu": "256",
"memory": "512"
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用更新服务进行部署时,cli 的回答是:
An error occurred (InvalidParameterException) when calling the UpdateService operation: The container backend does not exist in the task definition.
Run Code Online (Sandbox Code Playgroud)
但是如果我在 json 中将容器名称从csharp更改为backend,则部署工作。
这是一个错误吗?谢谢
Gau*_*rma 43
您在task_definition 中定义的容器name必须与ecs_service 的load_balancer 配置container_name 中的容器匹配。这将允许负载均衡器动态映射容器端口并将其附加到目标组。

Yas*_*har 12
我回答这个老问题是为了向 Google 员工指出一些注意事项。
似乎有两个问题与此错误消息相关。
第一个是错误本身是误导的,因为其背后的原因与任务定义没有直接关系,实际上这是负载均衡器(LB)抱怨容器名称,它试图在任务定义中查找。
作为问题本身,在创建 LB 时,containerName作为 prop 传递,在大多数情况下,它是第一个任务定义修订版上的容器名称之一。通过创建新的任务修订来更改创建 LB 时使用的容器名称可能会导致此错误。
在这种情况下,重新创建服务和/或任务定义可能会解决问题。
ECS 允许您在一个容器内定义多个容器task definition,因此 ELB 需要知道将流量定向到哪个容器,为此,它会存储您在创建过程中设置的容器的名称。
如果您收到此错误,则您可能没有包含具有相同内容的容器Container Name,因此它抱怨不知道要在新任务定义中连接到什么。
name将内部的容器重命名task definition为与当前运行(或上次成功部署)任务定义中定义的容器相同。