Search code examples
aws-cloudformationamazon-ecs

"elb name longer than 32" but only 8


I am trying to use AWS cloudformation to create a stack with an ALB and an ECS service, but i get a CREATE_FAILED on the AWS::ECS::Service, which is elb name longer than 32.

I don’t get why the ECS Service is complaining about the ELB name while the ALB itself is in CREATE_COMPLETE status…

Here is the JSON related to the ALB creation i send to cloudformation:

    "loadBalancer" : {
      "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties": {
        "Name": "test-alb",
        "Scheme" : "internal",
        "Subnets" : [
          "subnet-b8217295",
          "subnet-ddaad2b8",
          "subnet-6d71fb51"
        ],
        "LoadBalancerAttributes" : [
          { "Key" : "idle_timeout.timeout_seconds", "Value" : "50" }
        ],
        "SecurityGroups": [
          { "Ref": "InstanceSecurityGroupOpenWeb" },
          { "Ref" : "InstanceSecurityGroupOpenFull" }
        ],
        "Tags" : [
          { "Key" : "key", "Value" : "value" },
          { "Key" : "key2", "Value" : "value2" }
        ]
      }
    }

And here is the JSON related to the ECS Service creation (with a ref to the ALB defining above):

    "EcsService": {
      "Type":"AWS::ECS::Service",
      "Properties":{
        "Cluster":{
          "Ref": "EcsCluster"
        },
        "DesiredCount":"1",
        "DeploymentConfiguration":{
          "MaximumPercent":100,
          "MinimumHealthyPercent":0
        },
        "LoadBalancers": [
          {
            "ContainerName": "test-web",
            "ContainerPort":"80",
            "LoadBalancerName":{
              "Ref": "loadBalancer"
            }
          }
        ],
        "Role":{
          "Ref": "EcsServiceRole"
        },
        "TaskDefinition":{
          "Ref": "runWebServerTaskDefinition"
        }
      }
    }

And as you can see i set the name of the ALB by myself and it is only 8 characters, so i really don’t get the point, any idea?


Solution

  • When you do "Ref", it would return the Load balancer ARN not the Load balancer name. you need to use GetAtt to get the load balancer name

    { "Fn::GetAtt" : [ "loadBalancer", "LoadBalancerName" ] }