--- AWSTemplateFormatVersion: 2010-09-09 Parameters: Name: Type: String LaunchType: Type: String Default: Fargate AllowedValues: - Fargate - EC2 ECSImageId: Type: AWS::SSM::Parameter::Value Description: Use an Image from SSM Parameter Store Default: /aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id InstanceType: Type: String Default: t3.medium 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" ] 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 ${Name}-hosts SecurityGroupIngress: - SourceSecurityGroupId: !Ref SourceSecurityGroup IpProtocol: -1 VpcId: !Ref VpcId Cluster: Type: AWS::ECS::Cluster Properties: ClusterName: !Ref Name 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 ${Name} - 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: !Ref ECSImageId 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