AWSTemplateFormatVersion: '2010-09-09' Description: Creates an ECS cluster, consisting of two t2.small instance Parameters: InstanceType: Type: String Default: t2.small ClusterSize: Type: Number Default: 2 Subnets: Type: List SourceSecurityGroup1: Type: AWS::EC2::SecurityGroup::Id SourceSecurityGroup2: Type: AWS::EC2::SecurityGroup::Id VpcId: Type: AWS::EC2::VPC::Id Mappings: AWSRegionToAMI: us-east-1: AMI: ami-04351e12 us-east-2: AMI: ami-207b5a45 us-west-1: AMI: ami-7d664a1d us-west-2: AMI: ami-57d9cd2e eu-west-1: AMI: ami-809f84e6 eu-west-2: AMI: ami-ff15039b eu-central-1: AMI: ami-a3a006cc ap-northeast-1: AMI: ami-e4657283 ap-southeast-1: AMI: ami-19f7787a ap-southeast-2: AMI: ami-42e9f921 ca-central-1: AMI: ami-3da81759 cn-north-1: AMI: ami-0de63760 Resources: ECSRole: Type: AWS::IAM::Role Properties: Path: / AssumeRolePolicyDocument: | { "Statement": [{ "Effect": "Allow", "Principal": { "Service": [ "ec2.amazonaws.com" ]}, "Action": [ "sts:AssumeRole" ] }] } ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role InstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Path: / Roles: - !Ref ECSRole SecurityGroup: Type: "AWS::EC2::SecurityGroup" Properties: GroupDescription: !Sub ${AWS::StackName}-hosts SecurityGroupIngress: - SourceSecurityGroupId: !Ref SourceSecurityGroup1 IpProtocol: -1 - SourceSecurityGroupId: !Ref SourceSecurityGroup2 IpProtocol: -1 VpcId: !Ref VpcId Cluster: Type: AWS::ECS::Cluster Properties: ClusterName: !Ref AWS::StackName AutoScalingGroup: Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: !Ref Subnets LaunchConfigurationName: !Ref LaunchConfiguration MinSize: 1 DesiredCapacity: !Ref ClusterSize MaxSize: !Ref ClusterSize DesiredCapacity: !Ref ClusterSize Tags: - Key: Name Value: !Sub ${AWS::StackName} - ECS Host PropagateAtLaunch: true CreationPolicy: ResourceSignal: Timeout: PT15M UpdatePolicy: AutoScalingRollingUpdate: MinInstancesInService: 1 MaxBatchSize: 1 PauseTime: PT15M WaitOnResourceSignals: true LaunchConfiguration: Type: AWS::AutoScaling::LaunchConfiguration Metadata: AWS::CloudFormation::Init: config: commands: 01_add_instance_to_cluster: command: !Sub echo ECS_CLUSTER=${Cluster} > /etc/ecs/ecs.config files: "/etc/cfn/cfn-hup.conf": mode: 000400 owner: root group: root content: !Sub | [main] stack=${AWS::StackId} region=${AWS::Region} "/etc/cfn/hooks.d/cfn-auto-reloader.conf": content: !Sub | [cfn-auto-reloader-hook] triggers=post.update path=Resources.ContainerInstances.Metadata.AWS::CloudFormation::Init action=/opt/aws/bin/cfn-init -v --region ${AWS::Region} --stack ${AWS::StackName} --resource LaunchConfiguration services: sysvinit: cfn-hup: enabled: true ensureRunning: true files: - /etc/cfn/cfn-hup.conf - /etc/cfn/hooks.d/cfn-auto-reloader.conf Properties: ImageId: !FindInMap [ AWSRegionToAMI, !Ref "AWS::Region", AMI ] InstanceType: !Ref InstanceType IamInstanceProfile: !Ref InstanceProfile SecurityGroups: - !Ref SecurityGroup UserData: "Fn::Base64": !Sub | #!/bin/bash yum install -y aws-cfn-bootstrap /opt/aws/bin/cfn-init -v --region ${AWS::Region} --stack ${AWS::StackName} --resource LaunchConfiguration /opt/aws/bin/cfn-signal -e $? --region ${AWS::Region} --stack ${AWS::StackName} --resource AutoScalingGroup Outputs: ClusterName: Value: !Ref Cluster