Amazon web services 创建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

我正在使用Cloudformation创建AWS ECS服务

一切似乎都已成功完成,我可以看到实例已连接到负载平衡器,负载平衡器正在声明实例处于健康状态,如果我点击负载平衡器,我将成功地被带到正在运行的容器中

查看ECS控制面板,我可以看到服务已经稳定下来,一切看起来都正常。我还可以看到容器是稳定的,并且没有被终止/重新创建

然而,Cloudformation模板从未完成,它被困在
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::ServiceMyECSTaskDefinition:
        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