2
votes

Trying to create an ECS Service using the following Cloudformation resource definition:

  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

However it fails with the following error:

Value of property LoadBalancers must be a list of objects

But I am defining a list (albeit with one element).

The list contains an export of the ALB's arn.

What is the exact syntax?

edit: Here is the relevant documentation that does not seem consistent with the error:

LoadBalancers

A list of load balancer objects to associate with the cluster. If you specify the Role property, LoadBalancers must be specified as well. For information about the number of load balancers that you can specify per service, see Service Load Balancing in the Amazon Elastic Container Service Developer Guide. Required: Conditional Type: List of Amazon Elastic Container Service Service LoadBalancers

1

1 Answers

3
votes

I see that you copied the same template from AWS templates.

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

Note that LoadBalancers does not really directly reference the load balancer. It references the target group. This is quite weird given the naming but if you go through the web console you will reach the same conclusion.

If you look at AWS documentation:

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

These are Required but you can never get them by importing a load balancer.

If you think about it, by referencing a target group instead of a load balancer, you can share the same ALB for multiple target groups which is good for cost. So in conclusion it makes sense to reference the target group but the property name is misleading indeed.