AWS ECS:ECSService CloudFormation资源定义中的LoadBalancers属性错误

时间:2018-09-07 08:19:19

标签: amazon-web-services amazon-cloudformation amazon-ecs aws-ecs

尝试使用以下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的导出。

确切的语法是什么?

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

  

LoadBalancers

     

要与集群关联的负载均衡器对象列表。如果指定Role属性,则必须将LoadBalancers指定为   好。有关可以使用的负载均衡器数量的信息   指定每个服务,请参阅Amazon Elastic中的服务负载平衡   容器服务开发人员指南。       必需:有条件       类型:Amazon Elastic Container Service服务负载平衡器列表

1 个答案:

答案 0 :(得分:2)

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

[HttpPost]
            public async Task<IActionResult> Post([FromBody] ScheduleModel schedule)
            {
                _logger.LogInformation(JsonConvert.SerializeObject(schedule));
     
                var recurringSchedule = new AcmeRecurringSchedule
                {
                    Description = schedule.Description,
                    CronExpression = schedule.CronExpression,
                    ScheduleId = schedule.JobIdentifier,
                    ScheduleGroup = schedule.Group
                };
     
                var schedulerUrl = new Uri($"{_massTransitSettings.Protocol}://{_massTransitSettings.RabbitMqHost}/scheduler");
     
                var endpoint = await _busControl.GetSendEndpoint(schedulerUrl);
     
                await endpoint.ScheduleRecurringSend(schedulerUrl, recurringSchedule, new ScheduledRestInvocationMessage()
            {
                Url = new Uri("http://wwww.google.com")
            });
 
            return Ok(schedule.Key);
        }

请注意,LoadBalancers并没有真正直接引用负载均衡器。它引用目标组。鉴于命名,这很奇怪,但是如果您通过Web控制台浏览,您将得出相同的结论。

如果您查看AWS documentation

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

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

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