2
votes

I want to create a cloud formation script for the AWS ECS Cluster with Autoscaling group.

I tried the same with creating through the console and then copied the generated Cloud Formation Script from AWS Cloud formation.

    AWSTemplateFormatVersion: 2010-09-09
Description: >
  AWS CloudFormation template to create a new VPC or use an existing VPC for ECS
  deployment in Create Cluster Wizard. Requires exactly 1 Instance Types for a
  Spot Request.
Parameters:
  EcsClusterName:
    Type: String
    Description: >
      Specifies the ECS Cluster Name with which the resources would be
      associated
    Default: default
  KeyName:
    Type: String
    Description: >
      Optional - Specifies the name of an existing Amazon EC2 key pair to enable
      SSH access to the EC2 instances in your cluster.
    Default: ''
  VpcId:
    Type: String
    Description: >
      Optional - Specifies the ID of an existing VPC in which to launch your
      container instances. If you specify a VPC ID, you must specify a list of
      existing subnets in that VPC. If you do not specify a VPC ID, a new VPC is
      created with atleast 1 subnet.
    Default: ''
    ConstraintDescription: |
      VPC Id must begin with 'vpc-' or leave blank to have a new VPC created
  SecurityGroupId:
    Type: String
    Description: >
      Optional - Specifies the Security Group Id of an existing Security Group.
      Leave blank to have a new Security Group created
    Default: ''
  AsgMaxSize:
    Type: Number
    Description: >
      Specifies the number of instances to launch and register to the cluster.
      Defaults to 1.
    Default: '1'
  SecurityIngressFromPort:
    Type: Number
    Description: >
      Optional - Specifies the Start of Security Group port to open on ECS
      instances - defaults to port 0
    Default: '0'
  SecurityIngressToPort:
    Type: Number
    Description: >
      Optional - Specifies the End of Security Group port to open on ECS
      instances - defaults to port 65535
    Default: '65535'
  SecurityIngressCidrIp:
    Type: String
    Description: >
      Optional - Specifies the CIDR/IP range for Security Ports - defaults to
      0.0.0.0/0
    Default: 0.0.0.0/0
  EcsEndpoint:
    Type: String
    Description: |
      Optional - Specifies the ECS Endpoint for the ECS Agent to connect to
    Default: ''
  DeviceName:
    Type: String
    Description: Optional - Specifies the device mapping for the Volume
  UserData:
    Type: String
  IsWindows:
    Type: String
    Default: 'false'
Conditions:
  CreateEC2LCWithKeyPair: !Not 
    - !Equals 
      - Ref: KeyName
      - ''
  SetEndpointToECSAgent: !Not 
    - !Equals 
      - !Ref EcsEndpoint
      - ''
  CreateNewSecurityGroup: !Equals 
    - Ref: SecurityGroupId
    - ''
  CreateNewVpc: !Equals 
    - Ref: VpcId
    - ''
Resources:
  Vpc:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
    Metadata:
      'AWS::CloudFormation::Designer':
        id: 0e3933ae-23c2-44e1-a0d9-82fcfba93511
  PubSubnetAz1:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref Vpc
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: 'ap-southeast-1a'
      MapPublicIpOnLaunch: true
    Metadata:
      'AWS::CloudFormation::Designer':
        id: 6c7ca021-4114-4ec8-acf8-4f103ff7011f
  PubSubnetAz2:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref Vpc
      CidrBlock: 10.0.2.0/24
      AvailabilityZone: 'ap-southeast-1b'
      MapPublicIpOnLaunch: true
    Metadata:
      'AWS::CloudFormation::Designer':
        id: cfe07e5c-e00f-4918-b877-f567fa08c802
  InternetGateway:
    Type: 'AWS::EC2::InternetGateway'
    Metadata:
      'AWS::CloudFormation::Designer':
        id: 46bddd21-3027-4ccb-9e5d-ebf887429453
  AttachGateway:
    Type: 'AWS::EC2::VPCGatewayAttachment'
    Properties:
      VpcId: !Ref Vpc
      InternetGatewayId: !Ref InternetGateway
    Metadata:
      'AWS::CloudFormation::Designer':
        id: 11b7e802-d5ba-437a-8695-4bd5406d4db7
  RouteViaIgw:
    Type: 'AWS::EC2::RouteTable'
    Properties:
      VpcId: !Ref Vpc
    Metadata:
      'AWS::CloudFormation::Designer':
        id: 1a2f2b53-09d3-4c2c-8286-295870b8c602
  PublicRouteViaIgw:
    Type: 'AWS::EC2::Route'
    DependsOn:
      - AttachGateway
    Properties:
      RouteTableId: !Ref RouteViaIgw
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
    Metadata:
      'AWS::CloudFormation::Designer':
        id: 4b7c941a-8498-4e70-886b-9339018cc18a
  PubSubnet1RouteTableAssociation:
    Type: 'AWS::EC2::SubnetRouteTableAssociation'
    Properties:
      SubnetId: !Ref PubSubnetAz1
      RouteTableId: !Ref RouteViaIgw
    Metadata:
      'AWS::CloudFormation::Designer':
        id: cea0d60a-6d91-4922-90ea-f6db9f4378a9
  PubSubnet2RouteTableAssociation:
    Type: 'AWS::EC2::SubnetRouteTableAssociation'
    Properties:
      SubnetId: !Ref PubSubnetAz2
      RouteTableId: !Ref RouteViaIgw
    Metadata:
      'AWS::CloudFormation::Designer':
        id: c3b3c8e1-a9c8-47c6-8d26-b6f272bcd9e1
  EcsSecurityGroup:
    Condition: CreateNewSecurityGroup
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupDescription: ECS Allowed Ports
      SecurityGroupIngress:
        IpProtocol: tcp
        FromPort: !Ref SecurityIngressFromPort
        ToPort: !Ref SecurityIngressToPort
        CidrIp: !Ref SecurityIngressCidrIp
    Metadata:
      'AWS::CloudFormation::Designer':
        id: 493fdb30-54ce-4e4e-9cd6-c9faa6e3f93b
  EcsInstanceLc:
    # DependsOn
    Type: 'AWS::AutoScaling::LaunchConfiguration'
    Properties:
      ImageId: 'ami-050865a806e0dae53'
      InstanceType: 't2.large'
      # AssociatePublicIpAddress: false
      SecurityGroups:
        - !If 
          - CreateNewSecurityGroup
          - !Ref EcsSecurityGroup
          - !Ref SecurityGroupId
      # BlockDeviceMappings:
      #   - DeviceName: !Ref DeviceName
      #     Ebs:
      #       VolumeSize: '22'
      #       VolumeType: 'standard'
      # UserData:
      #   'Fn::Base64': !Ref UserData
    Metadata:
      'AWS::CloudFormation::Designer':
        id: 0e8e3b5a-7b14-4ffc-92af-ef9be7e51689
  EcsInstanceAsg:
    Type: 'AWS::AutoScaling::AutoScalingGroup'
    Properties:
      LaunchConfigurationName: !Ref EcsInstanceLc
      AvailabilityZones:
        - ap-southeast-1a
        - ap-southeast-1b   
      MinSize: '2'
      MaxSize: '3'
      DesiredCapacity: '2'
      Tags:
        - Key: Name
          Value: !Sub 'ECS Instance - ${AWS::StackName}'
          PropagateAtLaunch: 'true'
        - Key: Description
          Value: >-
            This instance is the part of the Auto Scaling group which was
            created through ECS Console
          PropagateAtLaunch: 'true'
    Metadata:
      'AWS::CloudFormation::Designer':
        id: 80731e0b-a9e5-461c-9049-e215aed2ad3d
Outputs:
  EcsInstanceAsgName:
    Description: Auto Scaling Group Name for ECS Instances
    Value: !Ref EcsInstanceAsg
  UsedByECSCreateCluster:
    Description: Flag used by ECS Create Cluster Wizard
    Value: 'true'
  TemplateVersion:
    Description: The version of the template used by Create Cluster Wizard
    Value: 2.0.0
Metadata:
  'AWS::CloudFormation::Designer':
    46bddd21-3027-4ccb-9e5d-ebf887429453:
      size:
        width: 60
        height: 60
      position:
        x: 720
        'y': 90
      z: 1
      embeds: []
    0e3933ae-23c2-44e1-a0d9-82fcfba93511:
      size:
        width: 600
        height: 600
      position:
        x: 60
        'y': 90
      z: 1
      embeds:
        - 1a2f2b53-09d3-4c2c-8286-295870b8c602
        - cfe07e5c-e00f-4918-b877-f567fa08c802
        - 6c7ca021-4114-4ec8-acf8-4f103ff7011f
    493fdb30-54ce-4e4e-9cd6-c9faa6e3f93b:
      size:
        width: 60
        height: 60
      position:
        x: 900
        'y': 540
      z: 1
      embeds: []
    0e8e3b5a-7b14-4ffc-92af-ef9be7e51689:
      size:
        width: 60
        height: 60
      position:
        x: 810
        'y': 350
      z: 1
      embeds: []
    80731e0b-a9e5-461c-9049-e215aed2ad3d:
      size:
        width: 60
        height: 60
      position:
        x: 720
        'y': 450
      z: 1
      embeds: []
      isassociatedwith:
        - 0e8e3b5a-7b14-4ffc-92af-ef9be7e51689
    1a2f2b53-09d3-4c2c-8286-295870b8c602:
      size:
        width: 240
        height: 240
      position:
        x: 90
        'y': 150
      z: 2
      parent: 0e3933ae-23c2-44e1-a0d9-82fcfba93511
      embeds: []
      iscontainedinside:
        - 0e3933ae-23c2-44e1-a0d9-82fcfba93511
        - 0e3933ae-23c2-44e1-a0d9-82fcfba93511
        - 0e3933ae-23c2-44e1-a0d9-82fcfba93511
        - 0e3933ae-23c2-44e1-a0d9-82fcfba93511
        - 0e3933ae-23c2-44e1-a0d9-82fcfba93511
    11b7e802-d5ba-437a-8695-4bd5406d4db7:
      source:
        id: 0e3933ae-23c2-44e1-a0d9-82fcfba93511
      target:
        id: 46bddd21-3027-4ccb-9e5d-ebf887429453
      z: 1
    4b7c941a-8498-4e70-886b-9339018cc18a:
      size:
        width: 60
        height: 60
      position:
        x: 480
        'y': -20
      z: 1
      embeds: []
      isassociatedwith:
        - 46bddd21-3027-4ccb-9e5d-ebf887429453
      iscontainedinside:
        - 1a2f2b53-09d3-4c2c-8286-295870b8c602
        - 1a2f2b53-09d3-4c2c-8286-295870b8c602
      dependson:
        - 11b7e802-d5ba-437a-8695-4bd5406d4db7
    cfe07e5c-e00f-4918-b877-f567fa08c802:
      size:
        width: 150
        height: 150
      position:
        x: 450
        'y': 360
      z: 2
      parent: 0e3933ae-23c2-44e1-a0d9-82fcfba93511
      embeds: []
      iscontainedinside:
        - 0e3933ae-23c2-44e1-a0d9-82fcfba93511
        - 0e3933ae-23c2-44e1-a0d9-82fcfba93511
        - 0e3933ae-23c2-44e1-a0d9-82fcfba93511
        - 0e3933ae-23c2-44e1-a0d9-82fcfba93511
        - 0e3933ae-23c2-44e1-a0d9-82fcfba93511
    c3b3c8e1-a9c8-47c6-8d26-b6f272bcd9e1:
      source:
        id: 1a2f2b53-09d3-4c2c-8286-295870b8c602
      target:
        id: cfe07e5c-e00f-4918-b877-f567fa08c802
      z: 2
    6c7ca021-4114-4ec8-acf8-4f103ff7011f:
      size:
        width: 150
        height: 150
      position:
        x: 390
        'y': 150
      z: 2
      parent: 0e3933ae-23c2-44e1-a0d9-82fcfba93511
      embeds: []
      iscontainedinside:
        - 0e3933ae-23c2-44e1-a0d9-82fcfba93511
        - 0e3933ae-23c2-44e1-a0d9-82fcfba93511
        - 0e3933ae-23c2-44e1-a0d9-82fcfba93511
        - 0e3933ae-23c2-44e1-a0d9-82fcfba93511
        - 0e3933ae-23c2-44e1-a0d9-82fcfba93511
    cea0d60a-6d91-4922-90ea-f6db9f4378a9:
      source:
        id: 1a2f2b53-09d3-4c2c-8286-295870b8c602
      target:
        id: 6c7ca021-4114-4ec8-acf8-4f103ff7011f
      z: 2

Then I changed it with specific parameters as I need and when I upload the script I am getting the below error and the process rollback.

Group did not stabilize. {current/minSize/maxSize} group size = {0/1/3}. Failed Scaling Activity: No default subnet for availability zone: 'ap-southeast-1b'. Launching EC2 instance failed.

1

1 Answers

2
votes

This issue is happening because of no default subnet ap-southeast-1b available in region ap-southeast-1 . Can you check if the default VPC is present along with default subnets in that region. If any of it is deleted then you can create the default subnet by following the steps mentioned in the link.