--- AWSTemplateFormatVersion: 2010-09-09 Parameters: LaunchType: Type: String Default: Fargate AllowedValues: - Fargate - EC2 InstanceType: Type: String Default: t2.micro ClusterSize: Type: Number Default: 2 Subnets: Type: List SourceSecurityGroup: Type: AWS::EC2::SecurityGroup::Id VpcId: Type: AWS::EC2::VPC::Id Conditions: EC2: !Equals [ !Ref LaunchType, "EC2" ] Mappings: AWSRegionToAMI: ap-south-1: AMI: ami-00491f6f eu-west-3: AMI: ami-9aef59e7 eu-west-2: AMI: ami-67cbd003 eu-west-1: AMI: ami-1d46df64 ap-northeast-2: AMI: ami-c212b2ac ap-northeast-1: AMI: ami-872c4ae1 sa-east-1: AMI: ami-af521fc3 ca-central-1: AMI: ami-435bde27 ap-southeast-1: AMI: ami-910d72ed ap-southeast-2: AMI: ami-58bb443a eu-central-1: AMI: ami-509a053f us-east-1: AMI: ami-28456852 us-east-2: AMI: ami-ce1c36ab us-west-1: AMI: ami-74262414 us-west-2: AMI: ami-decc7fa6 Resources: ECSRole: Type: AWS::IAM::Role Condition: EC2 Properties: Path: / AssumeRolePolicyDocument: Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: ec2.amazonaws.com ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role InstanceProfile: Type: AWS::IAM::InstanceProfile Condition: EC2 Properties: Path: / Roles: - !Ref ECSRole SecurityGroup: Type: "AWS::EC2::SecurityGroup" Condition: EC2 Properties: GroupDescription: !Sub ${AWS::StackName}-hosts SecurityGroupIngress: - SourceSecurityGroupId: !Ref SourceSecurityGroup IpProtocol: -1 VpcId: !Ref VpcId Cluster: Type: AWS::ECS::Cluster Properties: ClusterName: !Ref AWS::StackName AutoScalingGroup: Type: AWS::AutoScaling::AutoScalingGroup Condition: EC2 Properties: VPCZoneIdentifier: !Ref Subnets LaunchConfigurationName: !Ref LaunchConfiguration MinSize: !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 Condition: EC2 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