AWSTemplateFormatVersion: 2010-09-09 Description: > The CloudFormation template is designed for building ECS cluster & Task deployment. Metadata: Authors: Description: CC Parameters: baseStackName: Description: "The name of stack of infrastructure building." Type: String instanceType: Description: "Instance tyep for EC2." Type: String AllowedValues: - c4.large - c5.large - m4.large - r4.large - r5.large Default: c5.large keyPairName: Description: "Key pair name for EC2." Type: String Default: "nx-keypair" s3cf: Description: "S3 bucket and folder where to store cloudformation templates." Type: String Default: "cloudformation-box/ecs-mesh-workshop" ip4Ec2: Description: "DNS of the trusted identity provider for EC2." Type: String Default: "ec2.amazonaws.com.cn" #ec2.cn-northwest-1.amazonaws.com.cn #ec2.cn-north-1.amazonaws.com.cn useSpot: Description: "Use spot instance or not." Type: String Default: "yes" volSize: Description: "The size of root volume for EC2." Type: Number Default: 40 cpuTargetValue: Description: "The target value for CPU metric." Type: String Default: 20 desiredCount: Description: "The number of desired ec2-instance." Type: Number Default: 4 onDemandPercentage: Description: "On-demand capacity percentage in the whole capacity. On-demand/Spot, example 25->25%." Type: Number Default: 25 ecsami: Description: "ECS AMI ID - The Amazon Machine Image ID used for the cluster, leave it as the default value to get the latest AMI" Type: AWS::SSM::Parameter::Value Default: /aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id Conditions: UseSpotCondition: !Equals [ !Ref useSpot, 'yes' ] OnZHY: !Equals [ !Ref 'AWS::Region', cn-north-1 ] OnBJS: !Equals [ !Ref 'AWS::Region', cn-northwest-1 ] Mappings: RegionMap: ap-east-1: S3Endpoint: "s3.ap-east-1.amazonaws.com" ap-northeast-1: S3Endpoint: "s3.ap-northeast-1.amazonaws.com" ap-northeast-2: S3Endpoint: "s3.ap-northeast-2.amazonaws.com" ap-northeast-3: S3Endpoint: "s3.ap-northeast-3.amazonaws.com" ap-south-1: S3Endpoint: "s3.ap-south-1.amazonaws.com" ap-southeast-1: S3Endpoint: "s3.ap-southeast-1.amazonaws.com" ap-southeast-2: S3Endpoint: "s3.ap-southeast-2.amazonaws.com" ca-central-1: S3Endpoint: "s3.ca-central-1.amazonaws.com" cn-north-1: S3Endpoint: "s3.cn-north-1.amazonaws.com.cn" cn-northwest-1: S3Endpoint: "s3.cn-northwest-1.amazonaws.com.cn" eu-central-1: S3Endpoint: "s3.eu-central-1.amazonaws.com" eu-north-1: S3Endpoint: "s3.eu-north-1.amazonaws.com" eu-west-1: S3Endpoint: "s3.eu-west-1.amazonaws.com" eu-west-2: S3Endpoint: "s3.eu-west-2.amazonaws.com" eu-west-3: S3Endpoint: "s3.eu-west-3.amazonaws.com" me-south-1: S3Endpoint: "s3.me-south-1.amazonaws.com" sa-east-1: S3Endpoint: "s3.sa-east-1.amazonaws.com" us-east-1: S3Endpoint: "s3.amazonaws.com" us-east-2: S3Endpoint: "s3.us-east-2.amazonaws.com" us-gov-east-1: S3Endpoint: "s3.us-gov-east-1.amazonaws.com" us-gov-west-1: S3Endpoint: "s3.us-gov-west-1.amazonaws.com" us-west-1: S3Endpoint: "s3.us-west-1.amazonaws.com" us-west-2: S3Endpoint: "s3.us-west-2.amazonaws.com" Resources: EcsCluster: Type: AWS::CloudFormation::Stack Properties: Parameters: clusterName: !Sub '${AWS::StackName}-cluster' Tags: - Key: Name Value: !Sub '${AWS::StackName}-cluster' TemplateURL: !Join - '' - - 'https://' - !FindInMap [ RegionMap, !Ref 'AWS::Region', S3Endpoint ] - '/' - !Ref s3cf - '/templates/ecs/ecs-cluster.yaml' TimeoutInMinutes: "60" EcsNodes: Type: AWS::CloudFormation::Stack Properties: Parameters: keyPairName: !Ref keyPairName ami: !Ref ecsami baseVpc: Fn::ImportValue: !Sub '${baseStackName}-baseVpc' s3cf: !Ref s3cf publicSubnet1a: Fn::ImportValue: !Sub '${baseStackName}-pub1aSubnet' publicSubnet1b: Fn::ImportValue: !Sub '${baseStackName}-pub1bSubnet' privateSubnet1a: Fn::ImportValue: !Sub '${baseStackName}-pri1aSubnet' privateSubnet1b: Fn::ImportValue: !Sub '${baseStackName}-pri1bSubnet' instanceType: !Ref instanceType ecsCluster: !GetAtt EcsCluster.Outputs.appEcsCluster s3Dns: !FindInMap [ RegionMap, !Ref 'AWS::Region', S3Endpoint ] ip4Ec2: !If [OnZHY, !Ref ip4Ec2, !If [OnBJS, !Ref ip4Ec2, 'ec2.amazonaws.com']] nodesRole: Fn::ImportValue: !Sub '${baseStackName}-nodesRole' volSize: !Ref volSize cpuTargetValue: !Ref cpuTargetValue desiredCount: !Ref desiredCount onDemandPercentage: !Ref onDemandPercentage Tags: - Key: Name Value: !Sub '${AWS::StackName}-ecs-nodes' TemplateURL: Fn::If: - UseSpotCondition - !Join - '' - - 'https://' - !FindInMap [ RegionMap, !Ref 'AWS::Region', S3Endpoint ] - '/' - !Ref s3cf - '/templates/ecs/ecs-nodes-spotasg.yaml' - !Join - '' - - 'https://' - !FindInMap [ RegionMap, !Ref 'AWS::Region', S3Endpoint ] - '/' - !Ref s3cf - '/templates/ecs/ecs-nodes.yaml' TimeoutInMinutes: "60" LinkerdViz: Type: AWS::CloudFormation::Stack Properties: Parameters: keyPairName: !Ref keyPairName ami: !Ref ecsami baseVpc: Fn::ImportValue: !Sub '${baseStackName}-baseVpc' s3cf: !Ref s3cf publicSubnet1a: Fn::ImportValue: !Sub '${baseStackName}-pub1aSubnet' publicSubnet1b: Fn::ImportValue: !Sub '${baseStackName}-pub1bSubnet' instanceType: !Ref instanceType ecsCluster: !GetAtt EcsCluster.Outputs.appEcsCluster s3Dns: !FindInMap [ RegionMap, !Ref 'AWS::Region', S3Endpoint ] ip4Ec2: !If [OnZHY, !Ref ip4Ec2, !If [OnBJS, !Ref ip4Ec2, 'ec2.amazonaws.com']] nodesRole: Fn::ImportValue: !Sub '${baseStackName}-nodesRole' volSize: !Ref volSize Tags: - Key: Name Value: !Sub '${AWS::StackName}-linkerd-viz' TemplateURL: !Join - '' - - 'https://' - !FindInMap [ RegionMap, !Ref 'AWS::Region', S3Endpoint ] - '/' - !Ref s3cf - '/templates/ecs/linkerd-viz.yaml' TimeoutInMinutes: "60" LinkerdDeamon: Type: AWS::CloudFormation::Stack Properties: Parameters: keyPairName: !Ref keyPairName ami: !Ref ecsami publicSubnet1a: Fn::ImportValue: !Sub '${baseStackName}-pub1aSubnet' publicSubnet1b: Fn::ImportValue: !Sub '${baseStackName}-pub1bSubnet' ecsCluster: !GetAtt EcsCluster.Outputs.appEcsCluster nodeSecurityGroupId: !GetAtt EcsNodes.Outputs.appsvrSecurityGroup s3Dns: !FindInMap [ RegionMap, !Ref 'AWS::Region', S3Endpoint ] nodesRole: Fn::ImportValue: !Sub '${baseStackName}-nodesRole' Tags: - Key: Name Value: !Sub '${AWS::StackName}-linkerd-daemon' TemplateURL: !Join - '' - - 'https://' - !FindInMap [ RegionMap, !Ref 'AWS::Region', S3Endpoint ] - '/' - !Ref s3cf - '/templates/ecs/linkerd-daemons.yaml' TimeoutInMinutes: "60" Outputs: appElbTargetGroup: Description: ELB target grpup. Value: !GetAtt EcsNodes.Outputs.appElbTargetGroup Export: Name: !Sub '${AWS::StackName}-tg' appElasticLoadBalancing: Description: ELB target grpup. Value: !GetAtt EcsNodes.Outputs.appElasticLoadBalancing Export: Name: !Sub '${AWS::StackName}-elb' elbDns: Description: DNS name of Load Balancer. Value: !GetAtt EcsNodes.Outputs.elbDns appEcsCluster: Description: ECS cluster name. Value: !GetAtt EcsCluster.Outputs.appEcsCluster