AWSTemplateFormatVersion: "2010-09-09" Description: AWS Workshop - Cloud One Application Security with Fargate Parameters: ImageURI: Type: String Description: ECR Image URI (repository-url/image:tag) Mappings: SubnetConfig: VPC: CIDR: "10.0.0.0/16" PublicOne: CIDR: "10.0.0.0/24" PublicTwo: CIDR: "10.0.1.0/24" Resources: VPC: Type: AWS::EC2::VPC Properties: EnableDnsSupport: true EnableDnsHostnames: true CidrBlock: !FindInMap ["SubnetConfig", "VPC", "CIDR"] Tags: - Key: Name Value: !Ref AWS::StackName PublicSubnetOne: Type: AWS::EC2::Subnet Properties: AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: { Ref: "AWS::Region" } VpcId: !Ref "VPC" CidrBlock: !FindInMap ["SubnetConfig", "PublicOne", "CIDR"] MapPublicIpOnLaunch: true PublicSubnetTwo: Type: AWS::EC2::Subnet Properties: AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: { Ref: "AWS::Region" } VpcId: !Ref "VPC" CidrBlock: !FindInMap ["SubnetConfig", "PublicTwo", "CIDR"] MapPublicIpOnLaunch: true InternetGateway: Type: AWS::EC2::InternetGateway GatewayAttachement: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref "VPC" InternetGatewayId: !Ref "InternetGateway" PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref "VPC" PublicRoute: Type: AWS::EC2::Route DependsOn: GatewayAttachement Properties: RouteTableId: !Ref "PublicRouteTable" DestinationCidrBlock: "0.0.0.0/0" GatewayId: !Ref "InternetGateway" PublicSubnetOneRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetOne RouteTableId: !Ref PublicRouteTable PublicSubnetTwoRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetTwo RouteTableId: !Ref PublicRouteTable ECSCluster: Type: AWS::ECS::Cluster FargateContainerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Access to the Fargate containers VpcId: !Ref VPC SecurityGroupIngress: - IpProtocol: -1 CidrIp: 0.0.0.0/0 ECSRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [ecs.amazonaws.com] Action: ["sts:AssumeRole"] Path: / Policies: - PolicyName: ecs-service PolicyDocument: Statement: - Effect: Allow Action: - "ec2:AttachNetworkInterface" - "ec2:CreateNetworkInterface" - "ec2:CreateNetworkInterfacePermission" - "ec2:DeleteNetworkInterface" - "ec2:DeleteNetworkInterfacePermission" - "ec2:Describe*" - "ec2:DetachNetworkInterface" - "elasticloadbalancing:DeregisterInstancesFromLoadBalancer" - "elasticloadbalancing:DeregisterTargets" - "elasticloadbalancing:Describe*" - "elasticloadbalancing:RegisterInstancesWithLoadBalancer" - "elasticloadbalancing:RegisterTargets" Resource: "*" ECSTaskExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [ecs-tasks.amazonaws.com] Action: ["sts:AssumeRole"] Path: / Policies: - PolicyName: AmazonECSTaskExecutionRolePolicy PolicyDocument: Statement: - Effect: Allow Action: - "ecr:GetAuthorizationToken" - "ecr:BatchCheckLayerAvailability" - "ecr:GetDownloadUrlForLayer" - "ecr:BatchGetImage" - "logs:CreateLogStream" - "logs:PutLogEvents" Resource: "*" Taskdefinition: Type: AWS::ECS::TaskDefinition Properties: Cpu: 1024 Memory: 2048 NetworkMode: "awsvpc" ExecutionRoleArn: !Ref ECSTaskExecutionRole RequiresCompatibilities: - "FARGATE" ContainerDefinitions: - Name: "fargate-container-workshop" Image: !Ref ImageURI PortMappings: - ContainerPort: 8000 Protocol: tcp HostPort: 8000 ECSService: Type: AWS::ECS::Service Properties: LaunchType: FARGATE TaskDefinition: !Ref Taskdefinition PlatformVersion: LATEST Cluster: !Ref ECSCluster DesiredCount: 1 DeploymentConfiguration: MaximumPercent: 200 MinimumHealthyPercent: 100 NetworkConfiguration: AwsvpcConfiguration: AssignPublicIp: ENABLED SecurityGroups: - !Ref FargateContainerSecurityGroup Subnets: - !Ref PublicSubnetOne - !Ref PublicSubnetTwo Outputs: ClusterName: Description: The name of the ECS cluster Value: !GetAtt ECSCluster.Arn VPCId: Description: The ID of the VPC that this stack is deployed in Value: !Ref VPC FargateContainerSecurityGroup: Description: A security group used to allow Fargate containers to receive traffic Value: !Ref FargateContainerSecurityGroup