2

尝试使用以下 Cloudformation 资源定义创建 ECS 服务:

  MyUIService:
    Type: AWS::ECS::Service
    Properties:
      Cluster: !ImportValue MyClusterName
      DesiredCount: 1
      LaunchType: EC2
      LoadBalancers:
        - !ImportValue ALBDemo
      Role: !Ref MyServiceRole
      ServiceName: my-ui-service
      ServiceRegistries:
       - arn:aws:servicediscovery:eu-west-1:2398942890842:service/srv-ohc098mdj55yesez7
      TaskDefinition: !ImportValue MyTaskArn

但是它失败并出现以下错误:

属性 LoadBalancers 的值必须是对象列表

我正在定义一个列表(尽管只有一个元素)。

该列表包含 ALB 的 arn 的导出。

确切的语法是什么?

编辑:这是似乎与错误不一致的相关文档:

负载均衡器

与集群关联的负载均衡器对象列表。如果您指定 Role 属性,则还必须指定 LoadBalancers。有关您可以为每个服务指定的负载均衡器数量的信息,请参阅 Amazon Elastic Container Service Developer Guide 中的服务负载均衡。必需:条件类型:Amazon Elastic Container Service 服务负载平衡器列表

4

1 回答 1

3

我看到您从AWS 模板中复制了相同的模板

MyUIService:
  Type: AWS::ECS::Service
  Properties:
    Cluster: !ImportValue MyClusterName
    DesiredCount: 1
    LaunchType: EC2
    LoadBalancers:
      - ContainerName: simple-app
        ContainerPort: '80'
        TargetGroupArn: !Ref 'ECSTG'
    Role: !Ref MyServiceRole
    ServiceName: my-ui-service
    ServiceRegistries:
     - arn:aws:servicediscovery:eu-west-1:2398942890842:service/srv-ohc098mdj55yesez7
    TaskDefinition: !ImportValue MyTaskArn

请注意,LoadBalancers 并不真正直接引用负载均衡器。它引用了目标群体。考虑到命名,这很奇怪,但是如果您通过 Web 控制台,您将得出相同的结论。

如果您查看AWS 文档

ContainerName
The name of a container to use with the load balancer.

Required: Yes

Type: String


ContainerPort
The port number on the container to direct load balancer traffic to. Your container instances must allow ingress traffic on this port.

Required: Yes

Type: Integer

这些是必需的,但您永远无法通过导入负载均衡器来获得它们。

如果您考虑一下,通过引用目标组而不是负载均衡器,您可以为多个目标组共享同一个 ALB,这对成本有利。因此,总而言之,引用目标群体是有意义的,但属性名称确实具有误导性。

于 2018-09-07T08:40:59.710 回答