45

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

一切似乎都成功完成,我可以看到实例已附加到负载均衡器,负载均衡器正在声明该实例是健康的,如果我点击负载均衡器,我将成功地被带到我正在运行的容器中。

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

但是,Cloudformation 模板永远不会完成,它一直卡在CREATE_IN_PROGRESS大约 30-60 分钟后,当它回滚声称服务没有稳定时。查看 CloudTrail,我可以看到许多RegisterInstancesWithLoadBalancer实例化的ecs-service-scheduler,都具有相同的参数,即相同的实例 ID 和负载均衡器。我正在为 ECS 使用标准 IAM 角色和权限,因此这不应该是权限问题。

有人有类似的问题吗?

4

8 回答 8

25

AWS::ECS::Service需要注册完整的 ARN TaskDefinition(来源:请参阅 AWS 论坛上 ChrisB@AWS 的回答)。关键是为您设置TaskDefinition完整的ARN,包括 revision。如果您跳过修订版(: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"]]}
        }
    }
}

MyTaskDefinition这是通过 aws cli 和jq获取最新版本的绝妙方法:

aws ecs list-task-definitions --family-prefix MyTaskDefinition | jq --raw-output .taskDefinitionArns[0][-1:]
于 2016-02-18T04:49:21.310 回答
24

我发现了另一个相关的情况会导致这种情况,并认为我会把它放在这里以防其他人遇到它。如果您TaskDefinition使用实际上不存在于其中的图像定义 a,ContainerDefinition然后您尝试将其TaskDefinition作为服务运行,您将遇到相同的挂起问题(或者至少看起来像相同的问题)。

注意:下面的示例 YAML 块都在同一个 CloudFormation 模板中

例如,我创建了这个Repository

MyRepository:
    Type: AWS::ECR::Repository

然后我创建了这个Cluster

MyCluster:
    Type: AWS::ECS::Cluster

而这个TaskDefinition(删节):

MyECSTaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
        # ...
        ContainerDefinitions:
            # ...
              Image: !Join ["", [!Ref "AWS::AccountId", ".dkr.ecr.", !Ref "AWS::Region", ".amazonaws.com/", !Ref MyRepository, ":1"]]
            # ...

有了这些定义,我去创建一个Service这样的:

MyECSServiceDefinition:
    Type: AWS::ECS::Service
    Properties:
        Cluster: !Ref MyCluster
        DesiredCount: 2
        PlacementStrategies:
            - Type: spread
              Field: attribute:ecs.availability-zone
        TaskDefinition: !Ref MyECSTaskDefinition

这一切对我来说似乎都是明智的,但事实证明,在编写/部署时有两个问题导致它挂起。

  1. 设置为 2,这DesiredCount意味着它实际上会尝试启动服务并运行它,而不仅仅是定义它。如果我设置DesiredCount为 0,这工作得很好。
  2. Image定义的 in还不MyECSTaskDefinition存在。我将存储库作为此模板的一部分,但实际上我并没有向它推送任何内容。因此,当MyECSServiceDefinition尝试启动DesiredCount2 个实例时,它挂起,因为该图像实际上在存储库中不可用(因为存储库实际上只是在同一个模板中创建的)。

因此,目前,解决方案是创建 CloudFormation 堆栈,其中 aDesiredCount为 0 Service,将相应的内容上传Image到存储库,然后更新 CloudFormation 堆栈以扩展服务。或者,有一个单独的模板来设置像存储库这样的核心基础架构,将构建上传到那个,然后有一个单独的模板来运行来设置Services它们自己。

希望对遇到此问题的人有所帮助!

于 2017-06-16T18:08:09.373 回答
13

无需为 TaskDefinition 注册完整的 ARN,因为当将此资源的逻辑 ID 提供给 Ref 内部函数时,Ref 返回 Amazon 资源名称 (ARN)。

在以下示例中,Ref 函数返回 MyTaskDefinition 任务的 ARN,例如 arn:aws:ecs:us-west-2:123456789012:task/1abf0f6d-a411-4033-b8eb-a4eed3ad252a。

{“参考”:“我的任务定义”}

来源http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html

于 2016-07-19T09:39:10.820 回答
7

我想我有类似的问题。尝试查看服务模板中的“DesiredCount”属性。我认为 CloudFormation 将指示创建/更新仍在进行中,直到服务达到集群中的“DesiredCount”数量。

于 2015-10-11T11:30:25.897 回答
5

任何阻止 ECS 服务定义达到Desired Count的事物。一个示例是附加到实例使用的角色的策略中缺少权限。检查实例 ECS 代理日志(/var/log/ecs/ecs-agent.log.timestamp

另一个例子:实例没有足够的可用内存来匹配请求的Desired Count .... 事件将显示如下内容:

“...服务 myService 无法放置任务,因为没有容器实例满足其所有要求。最接近的匹配容器实例 123456789 没有足够的可用内存...”

于 2017-08-14T15:50:11.970 回答
3

要添加另一个数据点,我已经看到如果 ECR docker 映像不是 a) 可从 ECR repo 获得并且b) 通过运行状况检查,则会AWS::ECS::Service永久卡住。CREATE_IN_PROGRESS

我曾多次尝试AWS::ECS::Service使用有效图像哈希但失败健康检查容器启动一个,然后修复图像并执行各种“将所需计数设置为零”、“将其设置回”等。 ,并且没有任何 AFAICT 可以解决问题。

我最终不得不删除堆栈,并从立即通过健康检查的图像重新开始。然后它工作正常。

超级变态。

于 2019-10-04T20:43:41.197 回答
0

为了增加另一种可能性,我曾经遇到过这个问题,模板一切都很好,所需的任务计数 = 正在运行的任务数等。结果发现其中一个底层 EC2 实例卡在 100% 的 CPU 状态附近(但是EC2 认为它是“健康的”)。它阻止了 CloudFormation 验证该特定实例。我杀死了坏的 EC2 实例,ECS 启动了一个真正健康的实例。

于 2018-12-11T17:39:00.017 回答
0

我有同样的问题。我通过增加为任务定义分配的内存大小来解决。

您正在运行的容器不得超过 ECS 实例上的可用内存。

于 2018-06-27T02:11:14.203 回答