Amazon web services 创建ECS服务的Cloudformation模板卡在创建中
我正在使用Cloudformation创建AWS ECS服务 一切似乎都已成功完成,我可以看到实例已连接到负载平衡器,负载平衡器正在声明实例处于健康状态,如果我点击负载平衡器,我将成功地被带到正在运行的容器中 查看ECS控制面板,我可以看到服务已经稳定下来,一切看起来都正常。我还可以看到容器是稳定的,并且没有被终止/重新创建 然而,Cloudformation模板从未完成,它被困在Amazon web services 创建ECS服务的Cloudformation模板卡在创建中,amazon-web-services,amazon-cloudformation,amazon-ecs,Amazon Web Services,Amazon Cloudformation,Amazon Ecs,我正在使用Cloudformation创建AWS ECS服务 一切似乎都已成功完成,我可以看到实例已连接到负载平衡器,负载平衡器正在声明实例处于健康状态,如果我点击负载平衡器,我将成功地被带到正在运行的容器中 查看ECS控制面板,我可以看到服务已经稳定下来,一切看起来都正常。我还可以看到容器是稳定的,并且没有被终止/重新创建 然而,Cloudformation模板从未完成,它被困在CREATE\u in\u PROGRESS中,直到大约30-60分钟后,它回滚,声称服务没有稳定下来。查看Clou
CREATE\u in\u PROGRESS
中,直到大约30-60分钟后,它回滚,声称服务没有稳定下来。查看CloudTrail,我可以看到许多由ecs service scheduler
实例化的RegisterInstancesWithLoadBalancer
,都具有相同的参数,即相同的实例id和负载均衡器。我使用ECS的标准IAM角色和权限,因此这不应该是权限问题
有人有类似的问题吗?我想我也有类似的问题。
尝试查看服务模板中的“DesiredCount”属性。我认为CloudFormation将表明创建/更新仍在进行中,直到服务达到集群中“DesiredCount”的数量。您的
AWS::ECS::Service
需要为任务定义注册完整的ARN
(来源:)。关键是使用完整的ARN设置任务定义
,包括修订版。如果您跳过修订版(:123,在下面的示例中),将使用最新的修订版,但CloudFormation仍会在失败前一个小时与“CREATE_in_PROGRESS”共进午餐。有一种方法可以做到这一点:
"MyService": {
"Type": "AWS::ECS::Service",
"Properties": {
"Cluster": { "Ref": "ECSClusterArn" },
"DesiredCount": 1,
"LoadBalancers": [
{
"ContainerName": "myContainer",
"ContainerPort": "80",
"LoadBalancerName": "MyELBName"
}
],
"Role": { "Ref": "EcsElbServiceRoleArn" },
"TaskDefinition": {
"Fn::Join": ["", ["arn:aws:ecs:", { "Ref": "AWS::Region" },
":", { "Ref": "AWS::AccountId" },
":task-definition/my-task-definition-name:123"]]}
}
}
}
以下是一种通过aws cli获取最新版本的MyTaskDefinition
,以及:
无需为TaskDefinition注册完整的ARN,因为当将此资源的逻辑ID提供给Ref内在函数时,Ref返回Amazon资源名称(ARN)
在以下示例中,Ref函数返回MyTaskDefinition任务的ARN,例如ARN:aws:ecs:us-west-2:123456789012:task/1abf0f6d-a411-4033-b8eb-a4eed3ad252a
{“Ref”:“MyTaskDefinition”}
来源我发现另一个相关场景会导致这种情况,我想我会把它放在这里,以防其他人遇到它。如果您使用一个图像定义一个TaskDefinition
,而该图像实际上不存在于它的ContainerDefinition
中,然后您尝试将该TaskDefinition
作为一个服务运行,那么您将遇到相同的挂起问题(或者至少是看起来相同的问题)
注意:下面的示例YAML块都在同一个CloudFormation模板中
例如,我创建了这个存储库:
MyRepository:
Type: AWS::ECR::Repository
然后我创建了这个集群
:
MyCluster:
Type: AWS::ECS::Cluster
这是任务定义(节略):
有了这些定义,我开始创建一个服务
,如下所示:
MyECSServiceDefinition:
Type: AWS::ECS::Service
Properties:
Cluster: !Ref MyCluster
DesiredCount: 2
PlacementStrategies:
- Type: spread
Field: attribute:ecs.availability-zone
TaskDefinition: !Ref MyECSTaskDefinition
对我来说这一切似乎都是合理的,但事实证明,在编写/部署时,有两个问题导致它挂起
DesiredCount
设置为2,这意味着它将实际尝试启动服务并运行它,而不仅仅是定义它。如果我将DesiredCount
设置为0,则效果很好
myeCaskDefinition
中定义的图像
尚不存在。我将存储库作为这个模板的一部分,但实际上我没有将任何内容推送到它。因此,当MyECSServiceDefinition
试图加速2个实例的DesiredCount
时,它挂起,因为该映像在存储库中实际上不可用(因为存储库实际上是在同一模板中创建的)
因此,目前的解决方案是为服务创建DesiredCount
为0的CloudFormation堆栈,将适当的图像
上载到存储库,然后更新CloudFormation堆栈以扩大服务规模。或者,使用一个单独的模板来设置存储库之类的核心基础设施,将构建上传到存储库中,然后运行一个单独的模板来设置服务本身
希望这能帮助任何有这个问题的人 阻止ECS服务定义达到所需计数的任何内容。一个示例是实例使用的角色所附加的策略中缺少权限。检查实例ECS代理日志(/var/log/ECS/ECS-agent.log.timestamp)
另一个例子:
实例没有足够的可用内存来匹配请求的所需计数。。。。事件将显示如下内容:
“…service myService无法放置任务,因为没有容器实例满足其所有要求。最接近的匹配容器实例123456789的可用内存不足…”我也遇到了同样的问题。我通过增加为任务定义分配的内存大小来解决这个问题
您正在运行的容器不得超过ECS实例上的可用内存。为了增加另一种可能性,我曾经遇到过这个问题,模板、所需任务计数=#运行任务等都很好。结果表明,一个底层EC2实例的CPU状态接近100%(但EC2认为它是“健康的”)。它阻止了CloudFormation验证该特定实例。我杀死了坏的EC2实例,ECS启动了一个真正健康的实例。要添加另一个数据点,我看到AWS::ECS::Service
永久陷入创建过程中
如果ECR docker映像不同时是a)可从ECR回购和b)通过健康检查
我已多次尝试启动AWS::ECS::Service
MyECSTaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
# ...
ContainerDefinitions:
# ...
Image: !Join ["", [!Ref "AWS::AccountId", ".dkr.ecr.", !Ref "AWS::Region", ".amazonaws.com/", !Ref MyRepository, ":1"]]
# ...
MyECSServiceDefinition:
Type: AWS::ECS::Service
Properties:
Cluster: !Ref MyCluster
DesiredCount: 2
PlacementStrategies:
- Type: spread
Field: attribute:ecs.availability-zone
TaskDefinition: !Ref MyECSTaskDefinition