diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/LambdaTestDefaultTestDeployAssert1AF2B360.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/LambdaTestDefaultTestDeployAssert1AF2B360.assets.json new file mode 100644 index 0000000000000..eea0b94cdaea3 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/LambdaTestDefaultTestDeployAssert1AF2B360.assets.json @@ -0,0 +1,20 @@ +{ + "version": "48.0.0", + "files": { + "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { + "displayName": "LambdaTestDefaultTestDeployAssert1AF2B360 Template", + "source": { + "path": "LambdaTestDefaultTestDeployAssert1AF2B360.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region-d8d86b35": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/LambdaTestDefaultTestDeployAssert1AF2B360.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/LambdaTestDefaultTestDeployAssert1AF2B360.template.json new file mode 100644 index 0000000000000..ad9d0fb73d1dd --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/LambdaTestDefaultTestDeployAssert1AF2B360.template.json @@ -0,0 +1,36 @@ +{ + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/aws-cdk-ecs-integration-test-stack.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/aws-cdk-ecs-integration-test-stack.assets.json deleted file mode 100644 index fad9e7067f6bf..0000000000000 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/aws-cdk-ecs-integration-test-stack.assets.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": "45.0.0", - "files": { - "59dbe7102301a129565a9d0ffcc60b8a5063ca07ff546bcd6f384ffd9857b080": { - "displayName": "aws-cdk-ecs-integration-test-stack Template", - "source": { - "path": "aws-cdk-ecs-integration-test-stack.template.json", - "packaging": "file" - }, - "destinations": { - "current_account-current_region-03b9e879": { - "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "59dbe7102301a129565a9d0ffcc60b8a5063ca07ff546bcd6f384ffd9857b080.json", - "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" - } - } - } - }, - "dockerImages": {} -} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/cdk.out index 3704a1b682acf..523a9aac37cbf 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/cdk.out +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/cdk.out @@ -1 +1 @@ -{"version":"45.0.0"} \ No newline at end of file +{"version":"48.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/ecs-placement-strategies-empty.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/ecs-placement-strategies-empty.assets.json new file mode 100644 index 0000000000000..a59c8b15a1254 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/ecs-placement-strategies-empty.assets.json @@ -0,0 +1,20 @@ +{ + "version": "48.0.0", + "files": { + "d23919d5953945cbcc7595bbfbe018e37430febbdb3beeef1e41b1cc78141c42": { + "displayName": "ecs-placement-strategies-empty Template", + "source": { + "path": "ecs-placement-strategies-empty.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region-f763f3e9": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "d23919d5953945cbcc7595bbfbe018e37430febbdb3beeef1e41b1cc78141c42.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/ecs-placement-strategies-empty.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/ecs-placement-strategies-empty.template.json new file mode 100644 index 0000000000000..7e271e8329f0b --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/ecs-placement-strategies-empty.template.json @@ -0,0 +1,1002 @@ +{ + "Resources": { + "VPCB9E5F0B4": { + "Type": "AWS::EC2::VPC", + "Properties": { + "CidrBlock": "10.0.0.0/16", + "EnableDnsHostnames": true, + "EnableDnsSupport": true, + "InstanceTenancy": "default", + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/VPC" + } + ] + } + }, + "VPCPublicSubnet1SubnetB4246D30": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "AvailabilityZone": { + "Fn::Select": [ + 0, + { + "Fn::GetAZs": "" + } + ] + }, + "CidrBlock": "10.0.0.0/18", + "MapPublicIpOnLaunch": true, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "Public" + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Public" + }, + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/VPC/PublicSubnet1" + } + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } + } + }, + "VPCPublicSubnet1RouteTableFEE4B781": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/VPC/PublicSubnet1" + } + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } + } + }, + "VPCPublicSubnet1RouteTableAssociation0B0896DC": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "VPCPublicSubnet1RouteTableFEE4B781" + }, + "SubnetId": { + "Ref": "VPCPublicSubnet1SubnetB4246D30" + } + } + }, + "VPCPublicSubnet1DefaultRoute91CEF279": { + "Type": "AWS::EC2::Route", + "Properties": { + "DestinationCidrBlock": "0.0.0.0/0", + "GatewayId": { + "Ref": "VPCIGWB7E252D3" + }, + "RouteTableId": { + "Ref": "VPCPublicSubnet1RouteTableFEE4B781" + } + }, + "DependsOn": [ + "VPCVPCGW99B986DC" + ] + }, + "VPCPublicSubnet1EIP6AD938E8": { + "Type": "AWS::EC2::EIP", + "Properties": { + "Domain": "vpc", + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/VPC/PublicSubnet1" + } + ] + } + }, + "VPCPublicSubnet1NATGatewayE0556630": { + "Type": "AWS::EC2::NatGateway", + "Properties": { + "AllocationId": { + "Fn::GetAtt": [ + "VPCPublicSubnet1EIP6AD938E8", + "AllocationId" + ] + }, + "SubnetId": { + "Ref": "VPCPublicSubnet1SubnetB4246D30" + }, + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/VPC/PublicSubnet1" + } + ] + }, + "DependsOn": [ + "VPCPublicSubnet1DefaultRoute91CEF279", + "VPCPublicSubnet1RouteTableAssociation0B0896DC" + ] + }, + "VPCPublicSubnet2Subnet74179F39": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "AvailabilityZone": { + "Fn::Select": [ + 1, + { + "Fn::GetAZs": "" + } + ] + }, + "CidrBlock": "10.0.64.0/18", + "MapPublicIpOnLaunch": true, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "Public" + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Public" + }, + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/VPC/PublicSubnet2" + } + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } + } + }, + "VPCPublicSubnet2RouteTable6F1A15F1": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/VPC/PublicSubnet2" + } + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } + } + }, + "VPCPublicSubnet2RouteTableAssociation5A808732": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "VPCPublicSubnet2RouteTable6F1A15F1" + }, + "SubnetId": { + "Ref": "VPCPublicSubnet2Subnet74179F39" + } + } + }, + "VPCPublicSubnet2DefaultRouteB7481BBA": { + "Type": "AWS::EC2::Route", + "Properties": { + "DestinationCidrBlock": "0.0.0.0/0", + "GatewayId": { + "Ref": "VPCIGWB7E252D3" + }, + "RouteTableId": { + "Ref": "VPCPublicSubnet2RouteTable6F1A15F1" + } + }, + "DependsOn": [ + "VPCVPCGW99B986DC" + ] + }, + "VPCPublicSubnet2EIP4947BC00": { + "Type": "AWS::EC2::EIP", + "Properties": { + "Domain": "vpc", + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/VPC/PublicSubnet2" + } + ] + } + }, + "VPCPublicSubnet2NATGateway3C070193": { + "Type": "AWS::EC2::NatGateway", + "Properties": { + "AllocationId": { + "Fn::GetAtt": [ + "VPCPublicSubnet2EIP4947BC00", + "AllocationId" + ] + }, + "SubnetId": { + "Ref": "VPCPublicSubnet2Subnet74179F39" + }, + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/VPC/PublicSubnet2" + } + ] + }, + "DependsOn": [ + "VPCPublicSubnet2DefaultRouteB7481BBA", + "VPCPublicSubnet2RouteTableAssociation5A808732" + ] + }, + "VPCPrivateSubnet1Subnet8BCA10E0": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "AvailabilityZone": { + "Fn::Select": [ + 0, + { + "Fn::GetAZs": "" + } + ] + }, + "CidrBlock": "10.0.128.0/18", + "MapPublicIpOnLaunch": false, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "Private" + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Private" + }, + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/VPC/PrivateSubnet1" + } + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } + } + }, + "VPCPrivateSubnet1RouteTableBE8A6027": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/VPC/PrivateSubnet1" + } + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } + } + }, + "VPCPrivateSubnet1RouteTableAssociation347902D1": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "VPCPrivateSubnet1RouteTableBE8A6027" + }, + "SubnetId": { + "Ref": "VPCPrivateSubnet1Subnet8BCA10E0" + } + } + }, + "VPCPrivateSubnet1DefaultRouteAE1D6490": { + "Type": "AWS::EC2::Route", + "Properties": { + "DestinationCidrBlock": "0.0.0.0/0", + "NatGatewayId": { + "Ref": "VPCPublicSubnet1NATGatewayE0556630" + }, + "RouteTableId": { + "Ref": "VPCPrivateSubnet1RouteTableBE8A6027" + } + } + }, + "VPCPrivateSubnet2SubnetCFCDAA7A": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "AvailabilityZone": { + "Fn::Select": [ + 1, + { + "Fn::GetAZs": "" + } + ] + }, + "CidrBlock": "10.0.192.0/18", + "MapPublicIpOnLaunch": false, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "Private" + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Private" + }, + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/VPC/PrivateSubnet2" + } + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } + } + }, + "VPCPrivateSubnet2RouteTable0A19E10E": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/VPC/PrivateSubnet2" + } + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } + } + }, + "VPCPrivateSubnet2RouteTableAssociation0C73D413": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "VPCPrivateSubnet2RouteTable0A19E10E" + }, + "SubnetId": { + "Ref": "VPCPrivateSubnet2SubnetCFCDAA7A" + } + } + }, + "VPCPrivateSubnet2DefaultRouteF4F5CFD2": { + "Type": "AWS::EC2::Route", + "Properties": { + "DestinationCidrBlock": "0.0.0.0/0", + "NatGatewayId": { + "Ref": "VPCPublicSubnet2NATGateway3C070193" + }, + "RouteTableId": { + "Ref": "VPCPrivateSubnet2RouteTable0A19E10E" + } + } + }, + "VPCIGWB7E252D3": { + "Type": "AWS::EC2::InternetGateway", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/VPC" + } + ] + } + }, + "VPCVPCGW99B986DC": { + "Type": "AWS::EC2::VPCGatewayAttachment", + "Properties": { + "InternetGatewayId": { + "Ref": "VPCIGWB7E252D3" + }, + "VpcId": { + "Ref": "VPCB9E5F0B4" + } + } + }, + "EcsCluster97242B84": { + "Type": "AWS::ECS::Cluster" + }, + "EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231": { + "Type": "AWS::EC2::SecurityGroup", + "Properties": { + "GroupDescription": "ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1" + } + ], + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup" + } + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } + } + }, + "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "ec2.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup" + } + ] + } + }, + "EcsClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy04DC6C80": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "ecs:DeregisterContainerInstance", + "ecs:RegisterContainerInstance", + "ecs:Submit*" + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "EcsCluster97242B84", + "Arn" + ] + } + }, + { + "Action": [ + "ecs:Poll", + "ecs:StartTelemetrySession" + ], + "Condition": { + "ArnEquals": { + "ecs:cluster": { + "Fn::GetAtt": [ + "EcsCluster97242B84", + "Arn" + ] + } + } + }, + "Effect": "Allow", + "Resource": "*" + }, + { + "Action": [ + "ecr:GetAuthorizationToken", + "ecs:DiscoverPollEndpoint", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "EcsClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy04DC6C80", + "Roles": [ + { + "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863" + } + ] + } + }, + "EcsClusterDefaultAutoScalingGroupInstanceProfile2CE606B3": { + "Type": "AWS::IAM::InstanceProfile", + "Properties": { + "Roles": [ + { + "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863" + } + ] + } + }, + "EcsClusterDefaultAutoScalingGroupLaunchTemplate3719972A": { + "Type": "AWS::EC2::LaunchTemplate", + "Properties": { + "LaunchTemplateData": { + "IamInstanceProfile": { + "Arn": { + "Fn::GetAtt": [ + "EcsClusterDefaultAutoScalingGroupInstanceProfile2CE606B3", + "Arn" + ] + } + }, + "ImageId": { + "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter" + }, + "InstanceType": "t2.micro", + "Monitoring": { + "Enabled": false + }, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231", + "GroupId" + ] + } + ], + "TagSpecifications": [ + { + "ResourceType": "instance", + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate" + } + ] + }, + { + "ResourceType": "volume", + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate" + } + ] + } + ], + "UserData": { + "Fn::Base64": { + "Fn::Join": [ + "", + [ + "#!/bin/bash\necho ECS_CLUSTER=", + { + "Ref": "EcsCluster97242B84" + }, + " >> /etc/ecs/ecs.config\nsudo iptables --insert FORWARD 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP\nsudo service iptables save\necho ECS_AWSVPC_BLOCK_IMDS=true >> /etc/ecs/ecs.config" + ] + ] + } + } + }, + "TagSpecifications": [ + { + "ResourceType": "launch-template", + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate" + } + ] + } + ] + }, + "DependsOn": [ + "EcsClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy04DC6C80", + "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863" + ] + }, + "EcsClusterDefaultAutoScalingGroupASGC1A785DB": { + "Type": "AWS::AutoScaling::AutoScalingGroup", + "Properties": { + "LaunchTemplate": { + "LaunchTemplateId": { + "Ref": "EcsClusterDefaultAutoScalingGroupLaunchTemplate3719972A" + }, + "Version": { + "Fn::GetAtt": [ + "EcsClusterDefaultAutoScalingGroupLaunchTemplate3719972A", + "LatestVersionNumber" + ] + } + }, + "MaxSize": "1", + "MinSize": "1", + "Tags": [ + { + "Key": "Name", + "PropagateAtLaunch": true, + "Value": "ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup" + } + ], + "VPCZoneIdentifier": [ + { + "Ref": "VPCPrivateSubnet1Subnet8BCA10E0" + }, + { + "Ref": "VPCPrivateSubnet2SubnetCFCDAA7A" + } + ] + }, + "UpdatePolicy": { + "AutoScalingReplacingUpdate": { + "WillReplace": true + }, + "AutoScalingScheduledAction": { + "IgnoreUnmodifiedGroupSizeProperties": true + } + } + }, + "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ] + ] + } + ], + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup" + } + ] + } + }, + "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicyA45BF396": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "ec2:DescribeHosts", + "ec2:DescribeInstanceAttribute", + "ec2:DescribeInstanceStatus", + "ec2:DescribeInstances" + ], + "Effect": "Allow", + "Resource": "*" + }, + { + "Action": "autoscaling:CompleteLifecycleAction", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":autoscaling:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":autoScalingGroup:*:autoScalingGroupName/", + { + "Ref": "EcsClusterDefaultAutoScalingGroupASGC1A785DB" + } + ] + ] + } + }, + { + "Action": [ + "ecs:DescribeContainerInstances", + "ecs:DescribeTasks", + "ecs:ListTasks", + "ecs:UpdateContainerInstancesState" + ], + "Condition": { + "ArnEquals": { + "ecs:cluster": { + "Fn::GetAtt": [ + "EcsCluster97242B84", + "Arn" + ] + } + } + }, + "Effect": "Allow", + "Resource": "*" + }, + { + "Action": [ + "ecs:ListContainerInstances", + "ecs:SubmitContainerStateChange", + "ecs:SubmitTaskStateChange" + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "EcsCluster97242B84", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicyA45BF396", + "Roles": [ + { + "Ref": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA" + } + ] + } + }, + "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "ZipFile": "import boto3, json, os, time\n\necs = boto3.client('ecs')\nautoscaling = boto3.client('autoscaling')\n\n\ndef lambda_handler(event, context):\n print(json.dumps(dict(event, ResponseURL='...')))\n cluster = os.environ['CLUSTER']\n snsTopicArn = event['Records'][0]['Sns']['TopicArn']\n lifecycle_event = json.loads(event['Records'][0]['Sns']['Message'])\n instance_id = lifecycle_event.get('EC2InstanceId')\n if not instance_id:\n print(f\"Got event without EC2InstanceId: { json.dumps(dict(event, ResponseURL='...')) }\")\n return\n\n instance_arn = container_instance_arn(cluster, instance_id)\n print('Instance %s has container instance ARN %s' % (lifecycle_event['EC2InstanceId'], instance_arn))\n\n if not instance_arn:\n return\n\n task_arns = container_instance_task_arns(cluster, instance_arn)\n\n if task_arns:\n print('Instance ARN %s has task ARNs %s' % (instance_arn, ', '.join(task_arns)))\n\n while has_tasks(cluster, instance_arn, task_arns):\n time.sleep(10)\n\n try:\n print('Terminating instance %s' % instance_id)\n autoscaling.complete_lifecycle_action(\n LifecycleActionResult='CONTINUE',\n **pick(lifecycle_event, 'LifecycleHookName', 'LifecycleActionToken', 'AutoScalingGroupName'))\n except Exception as e:\n # Lifecycle action may have already completed.\n print(str(e))\n\n\ndef container_instance_arn(cluster, instance_id):\n \"\"\"Turn an instance ID into a container instance ARN.\"\"\"\n arns = ecs.list_container_instances(cluster=cluster, filter='ec2InstanceId==' + instance_id)['containerInstanceArns']\n if not arns:\n return None\n return arns[0]\n\ndef container_instance_task_arns(cluster, instance_arn):\n \"\"\"Fetch tasks for a container instance ARN.\"\"\"\n arns = ecs.list_tasks(cluster=cluster, containerInstance=instance_arn)['taskArns']\n return arns\n\ndef has_tasks(cluster, instance_arn, task_arns):\n \"\"\"Return True if the instance is running tasks for the given cluster.\"\"\"\n instances = ecs.describe_container_instances(cluster=cluster, containerInstances=[instance_arn])['containerInstances']\n if not instances:\n return False\n instance = instances[0]\n\n if instance['status'] == 'ACTIVE':\n # Start draining, then try again later\n set_container_instance_to_draining(cluster, instance_arn)\n return True\n\n task_count = None\n\n if task_arns:\n # Fetch details for tasks running on the container instance\n tasks = ecs.describe_tasks(cluster=cluster, tasks=task_arns)['tasks']\n if tasks:\n # Consider any non-stopped tasks as running\n task_count = sum(task['lastStatus'] != 'STOPPED' for task in tasks) + instance['pendingTasksCount']\n\n if not task_count:\n # Fallback to instance task counts if detailed task information is unavailable\n task_count = instance['runningTasksCount'] + instance['pendingTasksCount']\n\n print('Instance %s has %s tasks' % (instance_arn, task_count))\n\n return task_count > 0\n\ndef set_container_instance_to_draining(cluster, instance_arn):\n ecs.update_container_instances_state(\n cluster=cluster,\n containerInstances=[instance_arn], status='DRAINING')\n\n\ndef pick(dct, *keys):\n \"\"\"Pick a subset of a dict.\"\"\"\n return {k: v for k, v in dct.items() if k in keys}\n" + }, + "Environment": { + "Variables": { + "CLUSTER": { + "Ref": "EcsCluster97242B84" + } + } + }, + "Handler": "index.lambda_handler", + "Role": { + "Fn::GetAtt": [ + "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA", + "Arn" + ] + }, + "Runtime": "python3.13", + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup" + } + ], + "Timeout": 310 + }, + "DependsOn": [ + "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicyA45BF396", + "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA" + ] + }, + "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionAllowInvokeecsplacementstrategiesemptyEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0BAEDEABAA04B282": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E", + "Arn" + ] + }, + "Principal": "sns.amazonaws.com", + "SourceArn": { + "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4" + } + } + }, + "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionTopic8F34E394": { + "Type": "AWS::SNS::Subscription", + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ + "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E", + "Arn" + ] + }, + "Protocol": "lambda", + "TopicArn": { + "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4" + } + } + }, + "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4": { + "Type": "AWS::SNS::Topic", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup" + } + ] + } + }, + "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleA38EC83B": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "autoscaling.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Tags": [ + { + "Key": "Name", + "Value": "ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup" + } + ] + } + }, + "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicy75002F88": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "sns:Publish", + "Effect": "Allow", + "Resource": { + "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4" + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicy75002F88", + "Roles": [ + { + "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleA38EC83B" + } + ] + } + }, + "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookFFA63029": { + "Type": "AWS::AutoScaling::LifecycleHook", + "Properties": { + "AutoScalingGroupName": { + "Ref": "EcsClusterDefaultAutoScalingGroupASGC1A785DB" + }, + "DefaultResult": "CONTINUE", + "HeartbeatTimeout": 300, + "LifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING", + "NotificationTargetARN": { + "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4" + }, + "RoleARN": { + "Fn::GetAtt": [ + "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleA38EC83B", + "Arn" + ] + } + }, + "DependsOn": [ + "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicy75002F88", + "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleA38EC83B" + ] + }, + "TaskDefTaskRole1EDB4A67": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "ecs-tasks.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "TaskDef54694570": { + "Type": "AWS::ECS::TaskDefinition", + "Properties": { + "ContainerDefinitions": [ + { + "Essential": true, + "Image": "amazon/amazon-ecs-sample", + "Memory": 256, + "Name": "web" + } + ], + "Family": "ecsplacementstrategiesemptyTaskDefB57677EF", + "NetworkMode": "bridge", + "RequiresCompatibilities": [ + "EC2" + ], + "TaskRoleArn": { + "Fn::GetAtt": [ + "TaskDefTaskRole1EDB4A67", + "Arn" + ] + } + } + }, + "ServiceD69D759B": { + "Type": "AWS::ECS::Service", + "Properties": { + "Cluster": { + "Ref": "EcsCluster97242B84" + }, + "DeploymentConfiguration": { + "MaximumPercent": 200, + "MinimumHealthyPercent": 50 + }, + "EnableECSManagedTags": false, + "LaunchType": "EC2", + "PlacementStrategies": [], + "SchedulingStrategy": "REPLICA", + "TaskDefinition": { + "Ref": "TaskDef54694570" + } + }, + "DependsOn": [ + "TaskDefTaskRole1EDB4A67" + ] + } + }, + "Parameters": { + "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id" + }, + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/ecs-placement-strategies-with-strategies.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/ecs-placement-strategies-with-strategies.assets.json new file mode 100644 index 0000000000000..656d16eafe366 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/ecs-placement-strategies-with-strategies.assets.json @@ -0,0 +1,20 @@ +{ + "version": "48.0.0", + "files": { + "fe68a5da6d4417281457c469ec3fe07a27559bb206e71e4d742d0779d08a2475": { + "displayName": "ecs-placement-strategies-with-strategies Template", + "source": { + "path": "ecs-placement-strategies-with-strategies.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region-c8c7e863": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "fe68a5da6d4417281457c469ec3fe07a27559bb206e71e4d742d0779d08a2475.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/aws-cdk-ecs-integration-test-stack.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/ecs-placement-strategies-with-strategies.template.json similarity index 91% rename from packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/aws-cdk-ecs-integration-test-stack.template.json rename to packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/ecs-placement-strategies-with-strategies.template.json index dfdc07e1b61d7..3033b9f73dcb9 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/aws-cdk-ecs-integration-test-stack.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/ecs-placement-strategies-with-strategies.template.json @@ -10,7 +10,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/VPC" + "Value": "ecs-placement-strategies-with-strategies/VPC" } ] } @@ -39,7 +39,7 @@ }, { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1" + "Value": "ecs-placement-strategies-with-strategies/VPC/PublicSubnet1" } ], "VpcId": { @@ -53,7 +53,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1" + "Value": "ecs-placement-strategies-with-strategies/VPC/PublicSubnet1" } ], "VpcId": { @@ -94,7 +94,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1" + "Value": "ecs-placement-strategies-with-strategies/VPC/PublicSubnet1" } ] } @@ -114,7 +114,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1" + "Value": "ecs-placement-strategies-with-strategies/VPC/PublicSubnet1" } ] }, @@ -147,7 +147,7 @@ }, { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2" + "Value": "ecs-placement-strategies-with-strategies/VPC/PublicSubnet2" } ], "VpcId": { @@ -161,7 +161,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2" + "Value": "ecs-placement-strategies-with-strategies/VPC/PublicSubnet2" } ], "VpcId": { @@ -202,7 +202,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2" + "Value": "ecs-placement-strategies-with-strategies/VPC/PublicSubnet2" } ] } @@ -222,7 +222,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2" + "Value": "ecs-placement-strategies-with-strategies/VPC/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1" + "Value": "ecs-placement-strategies-with-strategies/VPC/PrivateSubnet1" } ], "VpcId": { @@ -269,7 +269,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1" + "Value": "ecs-placement-strategies-with-strategies/VPC/PrivateSubnet1" } ], "VpcId": { @@ -324,7 +324,7 @@ }, { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2" + "Value": "ecs-placement-strategies-with-strategies/VPC/PrivateSubnet2" } ], "VpcId": { @@ -338,7 +338,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2" + "Value": "ecs-placement-strategies-with-strategies/VPC/PrivateSubnet2" } ], "VpcId": { @@ -375,7 +375,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/VPC" + "Value": "ecs-placement-strategies-with-strategies/VPC" } ] } @@ -397,7 +397,7 @@ "EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup", + "GroupDescription": "ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -408,7 +408,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup" + "Value": "ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup" } ], "VpcId": { @@ -434,7 +434,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup" + "Value": "ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup" } ] } @@ -540,7 +540,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate" + "Value": "ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate" } ] }, @@ -549,7 +549,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate" + "Value": "ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate" + "Value": "ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate" } ] } @@ -606,7 +606,7 @@ { "Key": "Name", "PropagateAtLaunch": true, - "Value": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup" + "Value": "ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup" } ], "VPCZoneIdentifier": [ @@ -659,7 +659,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup" + "Value": "ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup" } ] } @@ -775,7 +775,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup" + "Value": "ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup" } ], "Timeout": 310 @@ -785,7 +785,7 @@ "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA" ] }, - "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionAllowInvokeawscdkecsintegrationteststackEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicD01B2572F6CCD921": { + "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionAllowInvokeecsplacementstrategieswithstrategiesEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic5B99916541E26280": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -822,7 +822,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup" + "Value": "ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup" } ] } @@ -845,7 +845,7 @@ "Tags": [ { "Key": "Name", - "Value": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup" + "Value": "ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup" } ] } @@ -925,7 +925,7 @@ "Name": "web" } ], - "Family": "awscdkecsintegrationteststackTaskDefF811D259", + "Family": "ecsplacementstrategieswithstrategiesTaskDef117DACB4", "NetworkMode": "bridge", "RequiresCompatibilities": [ "EC2" @@ -938,7 +938,7 @@ } } }, - "TestStackService5548C840": { + "ServiceD69D759B": { "Type": "AWS::ECS::Service", "Properties": { "Cluster": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/integ.json index fd337ef8d2812..2f0b3e4f15429 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/integ.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/integ.json @@ -1,15 +1,14 @@ { "version": "48.0.0", "testCases": { - "integ.placement-strategies": { + "LambdaTest/DefaultTest": { "stacks": [ - "aws-cdk-ecs-integration-test-stack" + "ecs-placement-strategies-with-strategies", + "ecs-placement-strategies-empty" ], - "diffAssets": false, - "stackUpdateWorkflow": true + "assertionStack": "LambdaTest/DefaultTest/DeployAssert", + "assertionStackName": "LambdaTestDefaultTestDeployAssert1AF2B360" } }, - "synthContext": {}, - "enableLookups": false, - "minimumCliVersion": "2.1023.0" + "minimumCliVersion": "2.1027.0" } \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/manifest.json index eaf3d2135d27e..30e5111de4a99 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/manifest.json @@ -1,28 +1,28 @@ { "version": "48.0.0", "artifacts": { - "aws-cdk-ecs-integration-test-stack.assets": { + "ecs-placement-strategies-with-strategies.assets": { "type": "cdk:asset-manifest", "properties": { - "file": "aws-cdk-ecs-integration-test-stack.assets.json", + "file": "ecs-placement-strategies-with-strategies.assets.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" } }, - "aws-cdk-ecs-integration-test-stack": { + "ecs-placement-strategies-with-strategies": { "type": "aws:cloudformation:stack", "environment": "aws://unknown-account/unknown-region", "properties": { - "templateFile": "aws-cdk-ecs-integration-test-stack.template.json", + "templateFile": "ecs-placement-strategies-with-strategies.template.json", "terminationProtection": false, "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/59dbe7102301a129565a9d0ffcc60b8a5063ca07ff546bcd6f384ffd9857b080.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/fe68a5da6d4417281457c469ec3fe07a27559bb206e71e4d742d0779d08a2475.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ - "aws-cdk-ecs-integration-test-stack.assets" + "ecs-placement-strategies-with-strategies.assets" ], "lookupRole": { "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", @@ -31,10 +31,10 @@ } }, "dependencies": [ - "aws-cdk-ecs-integration-test-stack.assets" + "ecs-placement-strategies-with-strategies.assets" ], "metadata": { - "/aws-cdk-ecs-integration-test-stack/VPC": [ + "/ecs-placement-strategies-with-strategies/VPC": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -42,13 +42,13 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/VPC/Resource": [ + "/ecs-placement-strategies-with-strategies/VPC/Resource": [ { "type": "aws:cdk:logicalId", "data": "VPCB9E5F0B4" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1": [ + "/ecs-placement-strategies-with-strategies/VPC/PublicSubnet1": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -84,43 +84,43 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/Subnet": [ + "/ecs-placement-strategies-with-strategies/VPC/PublicSubnet1/Subnet": [ { "type": "aws:cdk:logicalId", "data": "VPCPublicSubnet1SubnetB4246D30" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/RouteTable": [ + "/ecs-placement-strategies-with-strategies/VPC/PublicSubnet1/RouteTable": [ { "type": "aws:cdk:logicalId", "data": "VPCPublicSubnet1RouteTableFEE4B781" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/RouteTableAssociation": [ + "/ecs-placement-strategies-with-strategies/VPC/PublicSubnet1/RouteTableAssociation": [ { "type": "aws:cdk:logicalId", "data": "VPCPublicSubnet1RouteTableAssociation0B0896DC" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/DefaultRoute": [ + "/ecs-placement-strategies-with-strategies/VPC/PublicSubnet1/DefaultRoute": [ { "type": "aws:cdk:logicalId", "data": "VPCPublicSubnet1DefaultRoute91CEF279" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/EIP": [ + "/ecs-placement-strategies-with-strategies/VPC/PublicSubnet1/EIP": [ { "type": "aws:cdk:logicalId", "data": "VPCPublicSubnet1EIP6AD938E8" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/NATGateway": [ + "/ecs-placement-strategies-with-strategies/VPC/PublicSubnet1/NATGateway": [ { "type": "aws:cdk:logicalId", "data": "VPCPublicSubnet1NATGatewayE0556630" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2": [ + "/ecs-placement-strategies-with-strategies/VPC/PublicSubnet2": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -156,43 +156,43 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/Subnet": [ + "/ecs-placement-strategies-with-strategies/VPC/PublicSubnet2/Subnet": [ { "type": "aws:cdk:logicalId", "data": "VPCPublicSubnet2Subnet74179F39" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/RouteTable": [ + "/ecs-placement-strategies-with-strategies/VPC/PublicSubnet2/RouteTable": [ { "type": "aws:cdk:logicalId", "data": "VPCPublicSubnet2RouteTable6F1A15F1" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/RouteTableAssociation": [ + "/ecs-placement-strategies-with-strategies/VPC/PublicSubnet2/RouteTableAssociation": [ { "type": "aws:cdk:logicalId", "data": "VPCPublicSubnet2RouteTableAssociation5A808732" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/DefaultRoute": [ + "/ecs-placement-strategies-with-strategies/VPC/PublicSubnet2/DefaultRoute": [ { "type": "aws:cdk:logicalId", "data": "VPCPublicSubnet2DefaultRouteB7481BBA" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/EIP": [ + "/ecs-placement-strategies-with-strategies/VPC/PublicSubnet2/EIP": [ { "type": "aws:cdk:logicalId", "data": "VPCPublicSubnet2EIP4947BC00" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/NATGateway": [ + "/ecs-placement-strategies-with-strategies/VPC/PublicSubnet2/NATGateway": [ { "type": "aws:cdk:logicalId", "data": "VPCPublicSubnet2NATGateway3C070193" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1": [ + "/ecs-placement-strategies-with-strategies/VPC/PrivateSubnet1": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -220,31 +220,31 @@ "data": {} } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1/Subnet": [ + "/ecs-placement-strategies-with-strategies/VPC/PrivateSubnet1/Subnet": [ { "type": "aws:cdk:logicalId", "data": "VPCPrivateSubnet1Subnet8BCA10E0" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1/RouteTable": [ + "/ecs-placement-strategies-with-strategies/VPC/PrivateSubnet1/RouteTable": [ { "type": "aws:cdk:logicalId", "data": "VPCPrivateSubnet1RouteTableBE8A6027" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1/RouteTableAssociation": [ + "/ecs-placement-strategies-with-strategies/VPC/PrivateSubnet1/RouteTableAssociation": [ { "type": "aws:cdk:logicalId", "data": "VPCPrivateSubnet1RouteTableAssociation347902D1" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1/DefaultRoute": [ + "/ecs-placement-strategies-with-strategies/VPC/PrivateSubnet1/DefaultRoute": [ { "type": "aws:cdk:logicalId", "data": "VPCPrivateSubnet1DefaultRouteAE1D6490" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2": [ + "/ecs-placement-strategies-with-strategies/VPC/PrivateSubnet2": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -272,43 +272,43 @@ "data": {} } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2/Subnet": [ + "/ecs-placement-strategies-with-strategies/VPC/PrivateSubnet2/Subnet": [ { "type": "aws:cdk:logicalId", "data": "VPCPrivateSubnet2SubnetCFCDAA7A" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2/RouteTable": [ + "/ecs-placement-strategies-with-strategies/VPC/PrivateSubnet2/RouteTable": [ { "type": "aws:cdk:logicalId", "data": "VPCPrivateSubnet2RouteTable0A19E10E" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2/RouteTableAssociation": [ + "/ecs-placement-strategies-with-strategies/VPC/PrivateSubnet2/RouteTableAssociation": [ { "type": "aws:cdk:logicalId", "data": "VPCPrivateSubnet2RouteTableAssociation0C73D413" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2/DefaultRoute": [ + "/ecs-placement-strategies-with-strategies/VPC/PrivateSubnet2/DefaultRoute": [ { "type": "aws:cdk:logicalId", "data": "VPCPrivateSubnet2DefaultRouteF4F5CFD2" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/IGW": [ + "/ecs-placement-strategies-with-strategies/VPC/IGW": [ { "type": "aws:cdk:logicalId", "data": "VPCIGWB7E252D3" } ], - "/aws-cdk-ecs-integration-test-stack/VPC/VPCGW": [ + "/ecs-placement-strategies-with-strategies/VPC/VPCGW": [ { "type": "aws:cdk:logicalId", "data": "VPCVPCGW99B986DC" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster": [ + "/ecs-placement-strategies-with-strategies/EcsCluster": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -342,13 +342,13 @@ "data": "Blocking container access to instance role will be deprecated. Use the @aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature feature flagto keep this feature temporarily. See https://github.com/aws/aws-cdk/discussions/32609 [ack: @aws-cdk/aws-ecs:deprecatedImdsBlocking]" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/Resource": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/Resource": [ { "type": "aws:cdk:logicalId", "data": "EcsCluster97242B84" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -415,7 +415,7 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -424,13 +424,13 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource": [ { "type": "aws:cdk:logicalId", "data": "EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceRole": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -482,19 +482,19 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole": [ { "type": "aws:cdk:analytics:construct", "data": "*" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource": [ { "type": "aws:cdk:logicalId", "data": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy": [ { "type": "aws:cdk:analytics:construct", "data": "*" @@ -540,19 +540,19 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource": [ { "type": "aws:cdk:logicalId", "data": "EcsClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy04DC6C80" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceProfile": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceProfile": [ { "type": "aws:cdk:logicalId", "data": "EcsClusterDefaultAutoScalingGroupInstanceProfile2CE606B3" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -569,19 +569,19 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource": [ { "type": "aws:cdk:logicalId", "data": "EcsClusterDefaultAutoScalingGroupLaunchTemplate3719972A" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/ASG": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/ASG": [ { "type": "aws:cdk:logicalId", "data": "EcsClusterDefaultAutoScalingGroupASGC1A785DB" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -602,7 +602,7 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -674,19 +674,19 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole": [ { "type": "aws:cdk:analytics:construct", "data": "*" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource": [ { "type": "aws:cdk:logicalId", "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy": [ { "type": "aws:cdk:analytics:construct", "data": "*" @@ -748,25 +748,25 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource": [ { "type": "aws:cdk:logicalId", "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicyA45BF396" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource": [ { "type": "aws:cdk:logicalId", "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awscdkecsintegrationteststackEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicD01B2572": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:ecsplacementstrategieswithstrategiesEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic5B999165": [ { "type": "aws:cdk:logicalId", - "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionAllowInvokeawscdkecsintegrationteststackEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicD01B2572F6CCD921" + "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionAllowInvokeecsplacementstrategieswithstrategiesEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic5B99916541E26280" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -780,13 +780,13 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource": [ { "type": "aws:cdk:logicalId", "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionTopic8F34E394" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -798,7 +798,7 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -806,13 +806,13 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource": [ { "type": "aws:cdk:logicalId", "data": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -847,19 +847,19 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole": [ { "type": "aws:cdk:analytics:construct", "data": "*" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource": [ { "type": "aws:cdk:logicalId", "data": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleA38EC83B" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy": [ { "type": "aws:cdk:analytics:construct", "data": "*" @@ -889,25 +889,25 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource": [ { "type": "aws:cdk:logicalId", "data": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicy75002F88" } ], - "/aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource": [ + "/ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource": [ { "type": "aws:cdk:logicalId", "data": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookFFA63029" } ], - "/aws-cdk-ecs-integration-test-stack/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": [ + "/ecs-placement-strategies-with-strategies/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": [ { "type": "aws:cdk:logicalId", "data": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter" } ], - "/aws-cdk-ecs-integration-test-stack/TaskDef": [ + "/ecs-placement-strategies-with-strategies/TaskDef": [ { "type": "aws:cdk:analytics:construct", "data": "*" @@ -921,7 +921,7 @@ "data": "*" } ], - "/aws-cdk-ecs-integration-test-stack/TaskDef/TaskRole": [ + "/ecs-placement-strategies-with-strategies/TaskDef/TaskRole": [ { "type": "aws:cdk:analytics:construct", "data": { @@ -932,25 +932,25 @@ } } ], - "/aws-cdk-ecs-integration-test-stack/TaskDef/TaskRole/ImportTaskRole": [ + "/ecs-placement-strategies-with-strategies/TaskDef/TaskRole/ImportTaskRole": [ { "type": "aws:cdk:analytics:construct", "data": "*" } ], - "/aws-cdk-ecs-integration-test-stack/TaskDef/TaskRole/Resource": [ + "/ecs-placement-strategies-with-strategies/TaskDef/TaskRole/Resource": [ { "type": "aws:cdk:logicalId", "data": "TaskDefTaskRole1EDB4A67" } ], - "/aws-cdk-ecs-integration-test-stack/TaskDef/Resource": [ + "/ecs-placement-strategies-with-strategies/TaskDef/Resource": [ { "type": "aws:cdk:logicalId", "data": "TaskDef54694570" } ], - "/aws-cdk-ecs-integration-test-stack/Test_Stack": [ + "/ecs-placement-strategies-with-strategies/Service": [ { "type": "aws:cdk:warning", "data": "minHealthyPercent has not been configured so the default value of 50% is used. The number of running tasks will decrease below the desired count during deployments etc. See https://github.com/aws/aws-cdk/issues/31705 [ack: @aws-cdk/aws-ecs:minHealthyPercent]" @@ -964,26 +964,1058 @@ "data": "*" } ], - "/aws-cdk-ecs-integration-test-stack/Test_Stack/Service": [ + "/ecs-placement-strategies-with-strategies/Service/Service": [ { "type": "aws:cdk:logicalId", - "data": "TestStackService5548C840" + "data": "ServiceD69D759B" } ], - "/aws-cdk-ecs-integration-test-stack/BootstrapVersion": [ + "/ecs-placement-strategies-with-strategies/BootstrapVersion": [ { "type": "aws:cdk:logicalId", "data": "BootstrapVersion" } ], - "/aws-cdk-ecs-integration-test-stack/CheckBootstrapVersion": [ + "/ecs-placement-strategies-with-strategies/CheckBootstrapVersion": [ { "type": "aws:cdk:logicalId", "data": "CheckBootstrapVersion" } ] }, - "displayName": "aws-cdk-ecs-integration-test-stack" + "displayName": "ecs-placement-strategies-with-strategies" + }, + "ecs-placement-strategies-empty.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "ecs-placement-strategies-empty.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "ecs-placement-strategies-empty": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "ecs-placement-strategies-empty.template.json", + "terminationProtection": false, + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/d23919d5953945cbcc7595bbfbe018e37430febbdb3beeef1e41b1cc78141c42.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "ecs-placement-strategies-empty.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "ecs-placement-strategies-empty.assets" + ], + "metadata": { + "/ecs-placement-strategies-empty/VPC": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "restrictDefaultSecurityGroup": false + } + } + ], + "/ecs-placement-strategies-empty/VPC/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCB9E5F0B4" + } + ], + "/ecs-placement-strategies-empty/VPC/PublicSubnet1": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": true, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": true, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:method", + "data": {} + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addNatGateway": [ + "*" + ] + } + } + ], + "/ecs-placement-strategies-empty/VPC/PublicSubnet1/Subnet": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet1SubnetB4246D30" + } + ], + "/ecs-placement-strategies-empty/VPC/PublicSubnet1/RouteTable": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet1RouteTableFEE4B781" + } + ], + "/ecs-placement-strategies-empty/VPC/PublicSubnet1/RouteTableAssociation": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet1RouteTableAssociation0B0896DC" + } + ], + "/ecs-placement-strategies-empty/VPC/PublicSubnet1/DefaultRoute": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet1DefaultRoute91CEF279" + } + ], + "/ecs-placement-strategies-empty/VPC/PublicSubnet1/EIP": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet1EIP6AD938E8" + } + ], + "/ecs-placement-strategies-empty/VPC/PublicSubnet1/NATGateway": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet1NATGatewayE0556630" + } + ], + "/ecs-placement-strategies-empty/VPC/PublicSubnet2": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": true, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": true, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:method", + "data": {} + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addNatGateway": [ + "*" + ] + } + } + ], + "/ecs-placement-strategies-empty/VPC/PublicSubnet2/Subnet": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet2Subnet74179F39" + } + ], + "/ecs-placement-strategies-empty/VPC/PublicSubnet2/RouteTable": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet2RouteTable6F1A15F1" + } + ], + "/ecs-placement-strategies-empty/VPC/PublicSubnet2/RouteTableAssociation": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet2RouteTableAssociation5A808732" + } + ], + "/ecs-placement-strategies-empty/VPC/PublicSubnet2/DefaultRoute": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet2DefaultRouteB7481BBA" + } + ], + "/ecs-placement-strategies-empty/VPC/PublicSubnet2/EIP": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet2EIP4947BC00" + } + ], + "/ecs-placement-strategies-empty/VPC/PublicSubnet2/NATGateway": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet2NATGateway3C070193" + } + ], + "/ecs-placement-strategies-empty/VPC/PrivateSubnet1": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": false, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": false, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:method", + "data": {} + } + ], + "/ecs-placement-strategies-empty/VPC/PrivateSubnet1/Subnet": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet1Subnet8BCA10E0" + } + ], + "/ecs-placement-strategies-empty/VPC/PrivateSubnet1/RouteTable": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet1RouteTableBE8A6027" + } + ], + "/ecs-placement-strategies-empty/VPC/PrivateSubnet1/RouteTableAssociation": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet1RouteTableAssociation347902D1" + } + ], + "/ecs-placement-strategies-empty/VPC/PrivateSubnet1/DefaultRoute": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet1DefaultRouteAE1D6490" + } + ], + "/ecs-placement-strategies-empty/VPC/PrivateSubnet2": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": false, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": false, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:method", + "data": {} + } + ], + "/ecs-placement-strategies-empty/VPC/PrivateSubnet2/Subnet": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet2SubnetCFCDAA7A" + } + ], + "/ecs-placement-strategies-empty/VPC/PrivateSubnet2/RouteTable": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet2RouteTable0A19E10E" + } + ], + "/ecs-placement-strategies-empty/VPC/PrivateSubnet2/RouteTableAssociation": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet2RouteTableAssociation0C73D413" + } + ], + "/ecs-placement-strategies-empty/VPC/PrivateSubnet2/DefaultRoute": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet2DefaultRouteF4F5CFD2" + } + ], + "/ecs-placement-strategies-empty/VPC/IGW": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCIGWB7E252D3" + } + ], + "/ecs-placement-strategies-empty/VPC/VPCGW": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCVPCGW99B986DC" + } + ], + "/ecs-placement-strategies-empty/EcsCluster": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "vpc": "*" + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addCapacity": [ + "*", + { + "instanceType": "*" + } + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addAutoScalingGroup": [ + "*", + { + "machineImageType": 0 + } + ] + } + }, + { + "type": "aws:cdk:warning", + "data": "Blocking container access to instance role will be deprecated. Use the @aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature feature flagto keep this feature temporarily. See https://github.com/aws/aws-cdk/discussions/32609 [ack: @aws-cdk/aws-ecs:deprecatedImdsBlocking]" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsCluster97242B84" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "vpc": "*", + "machineImage": "*", + "updateType": "Replace", + "instanceType": "*" + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addUserData": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addUserData": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addUserData": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addUserData": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToRolePolicy": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToRolePolicy": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToRolePolicy": [ + {} + ] + } + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "vpc": "*", + "allowAllOutbound": true + } + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "roleName": "*", + "assumedBy": { + "principalAccount": "*", + "assumeRoleAction": "*" + } + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachInlinePolicy": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachInlinePolicy": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachToRole": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachToRole": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy04DC6C80" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceProfile": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterDefaultAutoScalingGroupInstanceProfile2CE606B3" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "machineImage": "*", + "instanceType": "*", + "detailedMonitoring": false, + "securityGroup": "*", + "userData": "*", + "associatePublicIpAddress": "*", + "spotOptions": "*", + "blockDevices": "*", + "instanceProfile": "*", + "keyPair": "*" + } + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterDefaultAutoScalingGroupLaunchTemplate3719972A" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/ASG": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterDefaultAutoScalingGroupASGC1A785DB" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "code": "*", + "handler": "*", + "runtime": "*", + "timeout": "*", + "environment": "*" + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addEnvironment": [ + "*", + "*" + ] + } + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "assumedBy": { + "principalAccount": "*", + "assumeRoleAction": "*" + }, + "managedPolicies": [ + { + "managedPolicyArn": "*" + } + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachInlinePolicy": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachInlinePolicy": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachToRole": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachToRole": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicyA45BF396" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:ecsplacementstrategiesemptyEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0BAEDEAB": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionAllowInvokeecsplacementstrategiesemptyEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0BAEDEABAA04B282" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "topic": "*", + "endpoint": "*", + "protocol": "lambda", + "filterPolicy": "*", + "filterPolicyWithMessageBody": "*", + "region": "*", + "deadLetterQueue": "*" + } + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionTopic8F34E394" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "autoScalingGroup": "*", + "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING", + "defaultResult": "CONTINUE", + "notificationTarget": "*", + "heartbeatTimeout": "*" + } + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "masterKey": "*" + } + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "assumedBy": { + "principalAccount": "*", + "assumeRoleAction": "*" + } + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachInlinePolicy": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachInlinePolicy": [ + "*" + ] + } + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleA38EC83B" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachToRole": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachToRole": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicy75002F88" + } + ], + "/ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookFFA63029" + } + ], + "/ecs-placement-strategies-empty/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": [ + { + "type": "aws:cdk:logicalId", + "data": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter" + } + ], + "/ecs-placement-strategies-empty/TaskDef": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + }, + { + "type": "aws:cdk:analytics:construct", + "data": "*" + }, + { + "type": "aws:cdk:analytics:method", + "data": "*" + } + ], + "/ecs-placement-strategies-empty/TaskDef/TaskRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "assumedBy": { + "principalAccount": "*", + "assumeRoleAction": "*" + } + } + } + ], + "/ecs-placement-strategies-empty/TaskDef/TaskRole/ImportTaskRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], + "/ecs-placement-strategies-empty/TaskDef/TaskRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "TaskDefTaskRole1EDB4A67" + } + ], + "/ecs-placement-strategies-empty/TaskDef/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "TaskDef54694570" + } + ], + "/ecs-placement-strategies-empty/Service": [ + { + "type": "aws:cdk:warning", + "data": "minHealthyPercent has not been configured so the default value of 50% is used. The number of running tasks will decrease below the desired count during deployments etc. See https://github.com/aws/aws-cdk/issues/31705 [ack: @aws-cdk/aws-ecs:minHealthyPercent]" + }, + { + "type": "aws:cdk:analytics:construct", + "data": "*" + }, + { + "type": "aws:cdk:analytics:method", + "data": "*" + } + ], + "/ecs-placement-strategies-empty/Service/Service": [ + { + "type": "aws:cdk:logicalId", + "data": "ServiceD69D759B" + } + ], + "/ecs-placement-strategies-empty/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/ecs-placement-strategies-empty/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "ecs-placement-strategies-empty" + }, + "LambdaTestDefaultTestDeployAssert1AF2B360.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "LambdaTestDefaultTestDeployAssert1AF2B360.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "LambdaTestDefaultTestDeployAssert1AF2B360": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "LambdaTestDefaultTestDeployAssert1AF2B360.template.json", + "terminationProtection": false, + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "LambdaTestDefaultTestDeployAssert1AF2B360.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "LambdaTestDefaultTestDeployAssert1AF2B360.assets" + ], + "metadata": { + "/LambdaTest/DefaultTest/DeployAssert/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/LambdaTest/DefaultTest/DeployAssert/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "LambdaTest/DefaultTest/DeployAssert" }, "Tree": { "type": "cdk:tree", @@ -996,57 +2028,48 @@ "properties": { "module": "aws-cdk-lib", "flags": { - "@aws-cdk/core:enableStackNameDuplicates": { - "recommendedValue": true, - "explanation": "Allow multiple stacks with the same name" - }, - "aws-cdk:enableDiffNoFail": { + "@aws-cdk/aws-signer:signingProfileNamePassedToCfn": { "recommendedValue": true, - "explanation": "Make `cdk diff` not fail when there are differences" + "explanation": "Pass signingProfileName to CfnSigningProfile" }, "@aws-cdk/core:newStyleStackSynthesis": { "recommendedValue": true, - "explanation": "Switch to new stack synthesis method which enables CI/CD" + "explanation": "Switch to new stack synthesis method which enables CI/CD", + "unconfiguredBehavesLike": { + "v2": true + } }, "@aws-cdk/core:stackRelativeExports": { "recommendedValue": true, - "explanation": "Name exports based on the construct paths relative to the stack, rather than the global construct path" - }, - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": { - "recommendedValue": true, - "explanation": "DockerImageAsset properly supports `.dockerignore` files by default" - }, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": { - "recommendedValue": true, - "explanation": "Fix the referencing of SecretsManager names from ARNs" - }, - "@aws-cdk/aws-kms:defaultKeyPolicies": { - "recommendedValue": true, - "explanation": "Tighten default KMS key policies" - }, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": { - "recommendedValue": true, - "explanation": "Remove `PutObjectAcl` from Bucket.grantWrite" + "explanation": "Name exports based on the construct paths relative to the stack, rather than the global construct path", + "unconfiguredBehavesLike": { + "v2": true + } }, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": { + "@aws-cdk/aws-ecs-patterns:secGroupsDisablesImplicitOpenListener": { "recommendedValue": true, - "explanation": "Do not specify a default DesiredCount for ECS services" + "explanation": "Disable implicit openListener when custom security groups are provided" }, "@aws-cdk/aws-rds:lowercaseDbIdentifier": { "recommendedValue": true, - "explanation": "Force lowercasing of RDS Cluster names in CDK" + "explanation": "Force lowercasing of RDS Cluster names in CDK", + "unconfiguredBehavesLike": { + "v2": true + } }, "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": { "recommendedValue": true, - "explanation": "Allow adding/removing multiple UsagePlanKeys independently" - }, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": { - "recommendedValue": true, - "explanation": "Enable this feature flag to have elastic file systems encrypted at rest by default." + "explanation": "Allow adding/removing multiple UsagePlanKeys independently", + "unconfiguredBehavesLike": { + "v2": true + } }, "@aws-cdk/aws-lambda:recognizeVersionProps": { "recommendedValue": true, - "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`." + "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`.", + "unconfiguredBehavesLike": { + "v2": true + } }, "@aws-cdk/aws-lambda:recognizeLayerVersion": { "userValue": true, @@ -1055,7 +2078,10 @@ }, "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": { "recommendedValue": true, - "explanation": "Enable this feature flag to have cloudfront distributions use the security policy TLSv1.2_2021 by default." + "explanation": "Enable this feature flag to have cloudfront distributions use the security policy TLSv1.2_2021 by default.", + "unconfiguredBehavesLike": { + "v2": true + } }, "@aws-cdk/core:checkSecretUsage": { "userValue": true, @@ -1276,7 +2302,10 @@ }, "@aws-cdk/pipelines:reduceAssetRoleTrustScope": { "recommendedValue": true, - "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy" + "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy", + "unconfiguredBehavesLike": { + "v2": true + } }, "@aws-cdk/aws-eks:nodegroupNameAttribute": { "userValue": true, @@ -1305,7 +2334,10 @@ }, "@aws-cdk/aws-stepfunctions-tasks:useNewS3UriParametersForBedrockInvokeModelTask": { "recommendedValue": true, - "explanation": "When enabled, use new props for S3 URI field in task definition of state machine for bedrock invoke model." + "explanation": "When enabled, use new props for S3 URI field in task definition of state machine for bedrock invoke model.", + "unconfiguredBehavesLike": { + "v2": true + } }, "@aws-cdk/core:explicitStackTags": { "userValue": true, @@ -1369,7 +2401,10 @@ }, "@aws-cdk/core:aspectStabilization": { "recommendedValue": true, - "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis." + "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis.", + "unconfiguredBehavesLike": { + "v2": true + } }, "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": { "userValue": true, @@ -1403,7 +2438,10 @@ }, "@aws-cdk/pipelines:reduceStageRoleTrustScope": { "recommendedValue": true, - "explanation": "Remove the root account principal from Stage addActions trust policy" + "explanation": "Remove the root account principal from Stage addActions trust policy", + "unconfiguredBehavesLike": { + "v2": true + } }, "@aws-cdk/aws-events:requireEventBusPolicySid": { "userValue": true, @@ -1426,7 +2464,10 @@ }, "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": { "recommendedValue": true, - "explanation": "When enabled, scopes down the trust policy for the cross-account action role" + "explanation": "When enabled, scopes down the trust policy for the cross-account action role", + "unconfiguredBehavesLike": { + "v2": true + } }, "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": { "userValue": true, @@ -1461,5 +2502,5 @@ } } }, - "minimumCliVersion": "2.1023.0" + "minimumCliVersion": "2.1027.0" } \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/tree.json index 046f8ffec11a8..d77a25810f45d 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/tree.json @@ -1 +1 @@ -{"version":"tree-0.1","tree":{"id":"App","path":"","constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.0.0"},"children":{"aws-cdk-ecs-integration-test-stack":{"id":"aws-cdk-ecs-integration-test-stack","path":"aws-cdk-ecs-integration-test-stack","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"VPC":{"id":"VPC","path":"aws-cdk-ecs-integration-test-stack/VPC","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/VPC/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPC","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPC","aws:cdk:cloudformation:props":{"cidrBlock":"10.0.0.0/16","enableDnsHostnames":true,"enableDnsSupport":true,"instanceTenancy":"default","tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/VPC"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PublicSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{},{"addNatGateway":["*"]}]},"children":{"Subnet":{"id":"Subnet","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[0,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.0.0/18","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPublicSubnet1RouteTableFEE4B781"},"subnetId":{"Ref":"VPCPublicSubnet1SubnetB4246D30"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","gatewayId":{"Ref":"VPCIGWB7E252D3"},"routeTableId":{"Ref":"VPCPublicSubnet1RouteTableFEE4B781"}}}},"EIP":{"id":"EIP","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/EIP","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::EIP","aws:cdk:cloudformation:props":{"domain":"vpc","tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/NATGateway","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnNatGateway","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::NatGateway","aws:cdk:cloudformation:props":{"allocationId":{"Fn::GetAtt":["VPCPublicSubnet1EIP6AD938E8","AllocationId"]},"subnetId":{"Ref":"VPCPublicSubnet1SubnetB4246D30"},"tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PublicSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{},{"addNatGateway":["*"]}]},"children":{"Subnet":{"id":"Subnet","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[1,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.64.0/18","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPublicSubnet2RouteTable6F1A15F1"},"subnetId":{"Ref":"VPCPublicSubnet2Subnet74179F39"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","gatewayId":{"Ref":"VPCIGWB7E252D3"},"routeTableId":{"Ref":"VPCPublicSubnet2RouteTable6F1A15F1"}}}},"EIP":{"id":"EIP","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/EIP","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::EIP","aws:cdk:cloudformation:props":{"domain":"vpc","tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/NATGateway","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnNatGateway","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::NatGateway","aws:cdk:cloudformation:props":{"allocationId":{"Fn::GetAtt":["VPCPublicSubnet2EIP4947BC00","AllocationId"]},"subnetId":{"Ref":"VPCPublicSubnet2Subnet74179F39"},"tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PrivateSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{}]},"children":{"Subnet":{"id":"Subnet","path":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[0,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.128.0/18","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPrivateSubnet1RouteTableBE8A6027"},"subnetId":{"Ref":"VPCPrivateSubnet1Subnet8BCA10E0"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","natGatewayId":{"Ref":"VPCPublicSubnet1NATGatewayE0556630"},"routeTableId":{"Ref":"VPCPrivateSubnet1RouteTableBE8A6027"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PrivateSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{}]},"children":{"Subnet":{"id":"Subnet","path":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[1,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.192.0/18","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPrivateSubnet2RouteTable0A19E10E"},"subnetId":{"Ref":"VPCPrivateSubnet2SubnetCFCDAA7A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","natGatewayId":{"Ref":"VPCPublicSubnet2NATGateway3C070193"},"routeTableId":{"Ref":"VPCPrivateSubnet2RouteTable0A19E10E"}}}}}},"IGW":{"id":"IGW","path":"aws-cdk-ecs-integration-test-stack/VPC/IGW","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnInternetGateway","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::InternetGateway","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/VPC"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-cdk-ecs-integration-test-stack/VPC/VPCGW","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPCGatewayAttachment","aws:cdk:cloudformation:props":{"internetGatewayId":{"Ref":"VPCIGWB7E252D3"},"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-cdk-ecs-integration-test-stack/EcsCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addCapacity":["*",{"instanceType":"*"}]},{"addAutoScalingGroup":["*",{"machineImageType":0}]}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCluster","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::Cluster","aws:cdk:cloudformation:props":{}}},"DefaultAutoScalingGroup":{"id":"DefaultAutoScalingGroup","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","instanceType":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroup","aws:cdk:cloudformation:props":{"groupDescription":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportInstanceRole":{"id":"ImportInstanceRole","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"ec2.amazonaws.com"}}],"Version":"2012-10-17"},"tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["ecs:DeregisterContainerInstance","ecs:RegisterContainerInstance","ecs:Submit*"],"Effect":"Allow","Resource":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"EcsClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy04DC6C80","roles":[{"Ref":"EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnInstanceProfile","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::InstanceProfile","aws:cdk:cloudformation:props":{"roles":[{"Ref":"EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.LaunchTemplate","version":"0.0.0","metadata":[{"machineImage":"*","instanceType":"*","detailedMonitoring":false,"securityGroup":"*","userData":"*","associatePublicIpAddress":"*","spotOptions":"*","blockDevices":"*","instanceProfile":"*","keyPair":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnLaunchTemplate","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::LaunchTemplate","aws:cdk:cloudformation:props":{"launchTemplateData":{"iamInstanceProfile":{"arn":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupInstanceProfile2CE606B3","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"EcsCluster97242B84"}," >> /etc/ecs/ecs.config\nsudo iptables --insert FORWARD 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP\nsudo service iptables save\necho ECS_AWSVPC_BLOCK_IMDS=true >> /etc/ecs/ecs.config"]]}}},"tagSpecifications":[{"resourceType":"launch-template","tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::AutoScaling::AutoScalingGroup","aws:cdk:cloudformation:props":{"launchTemplate":{"launchTemplateId":{"Ref":"EcsClusterDefaultAutoScalingGroupLaunchTemplate3719972A"},"version":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupLaunchTemplate3719972A","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VPCPrivateSubnet1Subnet8BCA10E0"},{"Ref":"VPCPrivateSubnet2SubnetCFCDAA7A"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"0.0.0","metadata":[{"code":"*","handler":"*","runtime":"*","timeout":"*","environment":"*"},{"addEnvironment":["*","*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}],"tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["ec2:DescribeHosts","ec2:DescribeInstanceAttribute","ec2:DescribeInstanceStatus","ec2:DescribeInstances"],"Effect":"Allow","Resource":"*"},{"Action":"autoscaling:CompleteLifecycleAction","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":autoscaling:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":autoScalingGroup:*:autoScalingGroupName/",{"Ref":"EcsClusterDefaultAutoScalingGroupASGC1A785DB"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]}}],"Version":"2012-10-17"},"policyName":"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicyA45BF396","roles":[{"Ref":"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Function","aws:cdk:cloudformation:props":{"code":{"zipFile":"import boto3, json, os, time\n\necs = boto3.client('ecs')\nautoscaling = boto3.client('autoscaling')\n\n\ndef lambda_handler(event, context):\n print(json.dumps(dict(event, ResponseURL='...')))\n cluster = os.environ['CLUSTER']\n snsTopicArn = event['Records'][0]['Sns']['TopicArn']\n lifecycle_event = json.loads(event['Records'][0]['Sns']['Message'])\n instance_id = lifecycle_event.get('EC2InstanceId')\n if not instance_id:\n print(f\"Got event without EC2InstanceId: { json.dumps(dict(event, ResponseURL='...')) }\")\n return\n\n instance_arn = container_instance_arn(cluster, instance_id)\n print('Instance %s has container instance ARN %s' % (lifecycle_event['EC2InstanceId'], instance_arn))\n\n if not instance_arn:\n return\n\n task_arns = container_instance_task_arns(cluster, instance_arn)\n\n if task_arns:\n print('Instance ARN %s has task ARNs %s' % (instance_arn, ', '.join(task_arns)))\n\n while has_tasks(cluster, instance_arn, task_arns):\n time.sleep(10)\n\n try:\n print('Terminating instance %s' % instance_id)\n autoscaling.complete_lifecycle_action(\n LifecycleActionResult='CONTINUE',\n **pick(lifecycle_event, 'LifecycleHookName', 'LifecycleActionToken', 'AutoScalingGroupName'))\n except Exception as e:\n # Lifecycle action may have already completed.\n print(str(e))\n\n\ndef container_instance_arn(cluster, instance_id):\n \"\"\"Turn an instance ID into a container instance ARN.\"\"\"\n arns = ecs.list_container_instances(cluster=cluster, filter='ec2InstanceId==' + instance_id)['containerInstanceArns']\n if not arns:\n return None\n return arns[0]\n\ndef container_instance_task_arns(cluster, instance_arn):\n \"\"\"Fetch tasks for a container instance ARN.\"\"\"\n arns = ecs.list_tasks(cluster=cluster, containerInstance=instance_arn)['taskArns']\n return arns\n\ndef has_tasks(cluster, instance_arn, task_arns):\n \"\"\"Return True if the instance is running tasks for the given cluster.\"\"\"\n instances = ecs.describe_container_instances(cluster=cluster, containerInstances=[instance_arn])['containerInstances']\n if not instances:\n return False\n instance = instances[0]\n\n if instance['status'] == 'ACTIVE':\n # Start draining, then try again later\n set_container_instance_to_draining(cluster, instance_arn)\n return True\n\n task_count = None\n\n if task_arns:\n # Fetch details for tasks running on the container instance\n tasks = ecs.describe_tasks(cluster=cluster, tasks=task_arns)['tasks']\n if tasks:\n # Consider any non-stopped tasks as running\n task_count = sum(task['lastStatus'] != 'STOPPED' for task in tasks) + instance['pendingTasksCount']\n\n if not task_count:\n # Fallback to instance task counts if detailed task information is unavailable\n task_count = instance['runningTasksCount'] + instance['pendingTasksCount']\n\n print('Instance %s has %s tasks' % (instance_arn, task_count))\n\n return task_count > 0\n\ndef set_container_instance_to_draining(cluster, instance_arn):\n ecs.update_container_instances_state(\n cluster=cluster,\n containerInstances=[instance_arn], status='DRAINING')\n\n\ndef pick(dct, *keys):\n \"\"\"Pick a subset of a dict.\"\"\"\n return {k: v for k, v in dct.items() if k in keys}\n"},"environment":{"variables":{"CLUSTER":{"Ref":"EcsCluster97242B84"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awscdkecsintegrationteststackEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicD01B2572":{"id":"AllowInvoke:awscdkecsintegrationteststackEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicD01B2572","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awscdkecsintegrationteststackEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicD01B2572","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"}}}},"Topic":{"id":"Topic","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Subscription","version":"0.0.0","metadata":[{"topic":"*","endpoint":"*","protocol":"lambda","filterPolicy":"*","filterPolicyWithMessageBody":"*","region":"*","deadLetterQueue":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.CfnSubscription","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Subscription","aws:cdk:cloudformation:props":{"endpoint":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E","Arn"]},"protocol":"lambda","topicArn":{"Ref":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.LifecycleHook","version":"0.0.0","metadata":[{"autoScalingGroup":"*","lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","defaultResult":"CONTINUE","notificationTarget":"*","heartbeatTimeout":"*"}]},"children":{"Topic":{"id":"Topic","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.CfnTopic","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Topic","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportRole":{"id":"ImportRole","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"autoscaling.amazonaws.com"}}],"Version":"2012-10-17"},"tags":[{"key":"Name","value":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":"sns:Publish","Effect":"Allow","Resource":{"Ref":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"}}],"Version":"2012-10-17"},"policyName":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicy75002F88","roles":[{"Ref":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleA38EC83B"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.CfnLifecycleHook","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::AutoScaling::LifecycleHook","aws:cdk:cloudformation:props":{"autoScalingGroupName":{"Ref":"EcsClusterDefaultAutoScalingGroupASGC1A785DB"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"},"roleArn":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleA38EC83B","Arn"]}}}}}}}}}},"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","path":"aws-cdk-ecs-integration-test-stack/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","path":"aws-cdk-ecs-integration-test-stack/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"TaskDef":{"id":"TaskDef","path":"aws-cdk-ecs-integration-test-stack/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-cdk-ecs-integration-test-stack/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-cdk-ecs-integration-test-stack/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/TaskDef/TaskRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"ecs-tasks.amazonaws.com"}}],"Version":"2012-10-17"}}}}}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-integration-test-stack/TaskDef/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnTaskDefinition","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::TaskDefinition","aws:cdk:cloudformation:props":{"containerDefinitions":[{"essential":true,"image":"amazon/amazon-ecs-sample","memory":256,"name":"web"}],"family":"awscdkecsintegrationteststackTaskDefF811D259","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"aws-cdk-ecs-integration-test-stack/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"Test_Stack":{"id":"Test_Stack","path":"aws-cdk-ecs-integration-test-stack/Test_Stack","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-cdk-ecs-integration-test-stack/Test_Stack/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnService","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::Service","aws:cdk:cloudformation:props":{"cluster":{"Ref":"EcsCluster97242B84"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"launchType":"EC2","placementStrategies":[{"type":"binpack","field":"CPU"},{"type":"binpack","field":"MEMORY"}],"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-cdk-ecs-integration-test-stack/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-cdk-ecs-integration-test-stack/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"Tree":{"id":"Tree","path":"Tree","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}}} \ No newline at end of file +{"version":"tree-0.1","tree":{"id":"App","path":"","constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.0.0"},"children":{"ecs-placement-strategies-with-strategies":{"id":"ecs-placement-strategies-with-strategies","path":"ecs-placement-strategies-with-strategies","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"VPC":{"id":"VPC","path":"ecs-placement-strategies-with-strategies/VPC","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/VPC/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPC","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPC","aws:cdk:cloudformation:props":{"cidrBlock":"10.0.0.0/16","enableDnsHostnames":true,"enableDnsSupport":true,"instanceTenancy":"default","tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/VPC"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet1","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PublicSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{},{"addNatGateway":["*"]}]},"children":{"Subnet":{"id":"Subnet","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet1/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[0,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.0.0/18","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet1/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet1/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPublicSubnet1RouteTableFEE4B781"},"subnetId":{"Ref":"VPCPublicSubnet1SubnetB4246D30"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet1/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","gatewayId":{"Ref":"VPCIGWB7E252D3"},"routeTableId":{"Ref":"VPCPublicSubnet1RouteTableFEE4B781"}}}},"EIP":{"id":"EIP","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet1/EIP","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::EIP","aws:cdk:cloudformation:props":{"domain":"vpc","tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet1/NATGateway","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnNatGateway","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::NatGateway","aws:cdk:cloudformation:props":{"allocationId":{"Fn::GetAtt":["VPCPublicSubnet1EIP6AD938E8","AllocationId"]},"subnetId":{"Ref":"VPCPublicSubnet1SubnetB4246D30"},"tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet2","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PublicSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{},{"addNatGateway":["*"]}]},"children":{"Subnet":{"id":"Subnet","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet2/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[1,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.64.0/18","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet2/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet2/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPublicSubnet2RouteTable6F1A15F1"},"subnetId":{"Ref":"VPCPublicSubnet2Subnet74179F39"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet2/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","gatewayId":{"Ref":"VPCIGWB7E252D3"},"routeTableId":{"Ref":"VPCPublicSubnet2RouteTable6F1A15F1"}}}},"EIP":{"id":"EIP","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet2/EIP","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::EIP","aws:cdk:cloudformation:props":{"domain":"vpc","tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet2/NATGateway","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnNatGateway","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::NatGateway","aws:cdk:cloudformation:props":{"allocationId":{"Fn::GetAtt":["VPCPublicSubnet2EIP4947BC00","AllocationId"]},"subnetId":{"Ref":"VPCPublicSubnet2Subnet74179F39"},"tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/VPC/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet1","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PrivateSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{}]},"children":{"Subnet":{"id":"Subnet","path":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet1/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[0,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.128.0/18","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet1/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet1/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPrivateSubnet1RouteTableBE8A6027"},"subnetId":{"Ref":"VPCPrivateSubnet1Subnet8BCA10E0"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet1/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","natGatewayId":{"Ref":"VPCPublicSubnet1NATGatewayE0556630"},"routeTableId":{"Ref":"VPCPrivateSubnet1RouteTableBE8A6027"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet2","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PrivateSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{}]},"children":{"Subnet":{"id":"Subnet","path":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet2/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[1,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.192.0/18","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet2/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet2/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPrivateSubnet2RouteTable0A19E10E"},"subnetId":{"Ref":"VPCPrivateSubnet2SubnetCFCDAA7A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"ecs-placement-strategies-with-strategies/VPC/PrivateSubnet2/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","natGatewayId":{"Ref":"VPCPublicSubnet2NATGateway3C070193"},"routeTableId":{"Ref":"VPCPrivateSubnet2RouteTable0A19E10E"}}}}}},"IGW":{"id":"IGW","path":"ecs-placement-strategies-with-strategies/VPC/IGW","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnInternetGateway","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::InternetGateway","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/VPC"}]}}},"VPCGW":{"id":"VPCGW","path":"ecs-placement-strategies-with-strategies/VPC/VPCGW","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPCGatewayAttachment","aws:cdk:cloudformation:props":{"internetGatewayId":{"Ref":"VPCIGWB7E252D3"},"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"ecs-placement-strategies-with-strategies/EcsCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addCapacity":["*",{"instanceType":"*"}]},{"addAutoScalingGroup":["*",{"machineImageType":0}]}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/EcsCluster/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCluster","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::Cluster","aws:cdk:cloudformation:props":{}}},"DefaultAutoScalingGroup":{"id":"DefaultAutoScalingGroup","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","instanceType":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroup","aws:cdk:cloudformation:props":{"groupDescription":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportInstanceRole":{"id":"ImportInstanceRole","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"ec2.amazonaws.com"}}],"Version":"2012-10-17"},"tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["ecs:DeregisterContainerInstance","ecs:RegisterContainerInstance","ecs:Submit*"],"Effect":"Allow","Resource":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"EcsClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy04DC6C80","roles":[{"Ref":"EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/InstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnInstanceProfile","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::InstanceProfile","aws:cdk:cloudformation:props":{"roles":[{"Ref":"EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.LaunchTemplate","version":"0.0.0","metadata":[{"machineImage":"*","instanceType":"*","detailedMonitoring":false,"securityGroup":"*","userData":"*","associatePublicIpAddress":"*","spotOptions":"*","blockDevices":"*","instanceProfile":"*","keyPair":"*"}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnLaunchTemplate","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::LaunchTemplate","aws:cdk:cloudformation:props":{"launchTemplateData":{"iamInstanceProfile":{"arn":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupInstanceProfile2CE606B3","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"EcsCluster97242B84"}," >> /etc/ecs/ecs.config\nsudo iptables --insert FORWARD 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP\nsudo service iptables save\necho ECS_AWSVPC_BLOCK_IMDS=true >> /etc/ecs/ecs.config"]]}}},"tagSpecifications":[{"resourceType":"launch-template","tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::AutoScaling::AutoScalingGroup","aws:cdk:cloudformation:props":{"launchTemplate":{"launchTemplateId":{"Ref":"EcsClusterDefaultAutoScalingGroupLaunchTemplate3719972A"},"version":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupLaunchTemplate3719972A","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VPCPrivateSubnet1Subnet8BCA10E0"},{"Ref":"VPCPrivateSubnet2SubnetCFCDAA7A"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"0.0.0","metadata":[{"code":"*","handler":"*","runtime":"*","timeout":"*","environment":"*"},{"addEnvironment":["*","*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}],"tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["ec2:DescribeHosts","ec2:DescribeInstanceAttribute","ec2:DescribeInstanceStatus","ec2:DescribeInstances"],"Effect":"Allow","Resource":"*"},{"Action":"autoscaling:CompleteLifecycleAction","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":autoscaling:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":autoScalingGroup:*:autoScalingGroupName/",{"Ref":"EcsClusterDefaultAutoScalingGroupASGC1A785DB"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]}}],"Version":"2012-10-17"},"policyName":"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicyA45BF396","roles":[{"Ref":"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA"}]}}}}}}},"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Function","aws:cdk:cloudformation:props":{"code":{"zipFile":"import boto3, json, os, time\n\necs = boto3.client('ecs')\nautoscaling = boto3.client('autoscaling')\n\n\ndef lambda_handler(event, context):\n print(json.dumps(dict(event, ResponseURL='...')))\n cluster = os.environ['CLUSTER']\n snsTopicArn = event['Records'][0]['Sns']['TopicArn']\n lifecycle_event = json.loads(event['Records'][0]['Sns']['Message'])\n instance_id = lifecycle_event.get('EC2InstanceId')\n if not instance_id:\n print(f\"Got event without EC2InstanceId: { json.dumps(dict(event, ResponseURL='...')) }\")\n return\n\n instance_arn = container_instance_arn(cluster, instance_id)\n print('Instance %s has container instance ARN %s' % (lifecycle_event['EC2InstanceId'], instance_arn))\n\n if not instance_arn:\n return\n\n task_arns = container_instance_task_arns(cluster, instance_arn)\n\n if task_arns:\n print('Instance ARN %s has task ARNs %s' % (instance_arn, ', '.join(task_arns)))\n\n while has_tasks(cluster, instance_arn, task_arns):\n time.sleep(10)\n\n try:\n print('Terminating instance %s' % instance_id)\n autoscaling.complete_lifecycle_action(\n LifecycleActionResult='CONTINUE',\n **pick(lifecycle_event, 'LifecycleHookName', 'LifecycleActionToken', 'AutoScalingGroupName'))\n except Exception as e:\n # Lifecycle action may have already completed.\n print(str(e))\n\n\ndef container_instance_arn(cluster, instance_id):\n \"\"\"Turn an instance ID into a container instance ARN.\"\"\"\n arns = ecs.list_container_instances(cluster=cluster, filter='ec2InstanceId==' + instance_id)['containerInstanceArns']\n if not arns:\n return None\n return arns[0]\n\ndef container_instance_task_arns(cluster, instance_arn):\n \"\"\"Fetch tasks for a container instance ARN.\"\"\"\n arns = ecs.list_tasks(cluster=cluster, containerInstance=instance_arn)['taskArns']\n return arns\n\ndef has_tasks(cluster, instance_arn, task_arns):\n \"\"\"Return True if the instance is running tasks for the given cluster.\"\"\"\n instances = ecs.describe_container_instances(cluster=cluster, containerInstances=[instance_arn])['containerInstances']\n if not instances:\n return False\n instance = instances[0]\n\n if instance['status'] == 'ACTIVE':\n # Start draining, then try again later\n set_container_instance_to_draining(cluster, instance_arn)\n return True\n\n task_count = None\n\n if task_arns:\n # Fetch details for tasks running on the container instance\n tasks = ecs.describe_tasks(cluster=cluster, tasks=task_arns)['tasks']\n if tasks:\n # Consider any non-stopped tasks as running\n task_count = sum(task['lastStatus'] != 'STOPPED' for task in tasks) + instance['pendingTasksCount']\n\n if not task_count:\n # Fallback to instance task counts if detailed task information is unavailable\n task_count = instance['runningTasksCount'] + instance['pendingTasksCount']\n\n print('Instance %s has %s tasks' % (instance_arn, task_count))\n\n return task_count > 0\n\ndef set_container_instance_to_draining(cluster, instance_arn):\n ecs.update_container_instances_state(\n cluster=cluster,\n containerInstances=[instance_arn], status='DRAINING')\n\n\ndef pick(dct, *keys):\n \"\"\"Pick a subset of a dict.\"\"\"\n return {k: v for k, v in dct.items() if k in keys}\n"},"environment":{"variables":{"CLUSTER":{"Ref":"EcsCluster97242B84"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:ecsplacementstrategieswithstrategiesEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic5B999165":{"id":"AllowInvoke:ecsplacementstrategieswithstrategiesEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic5B999165","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:ecsplacementstrategieswithstrategiesEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic5B999165","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"}}}},"Topic":{"id":"Topic","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Subscription","version":"0.0.0","metadata":[{"topic":"*","endpoint":"*","protocol":"lambda","filterPolicy":"*","filterPolicyWithMessageBody":"*","region":"*","deadLetterQueue":"*"}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.CfnSubscription","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Subscription","aws:cdk:cloudformation:props":{"endpoint":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E","Arn"]},"protocol":"lambda","topicArn":{"Ref":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.LifecycleHook","version":"0.0.0","metadata":[{"autoScalingGroup":"*","lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","defaultResult":"CONTINUE","notificationTarget":"*","heartbeatTimeout":"*"}]},"children":{"Topic":{"id":"Topic","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.CfnTopic","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Topic","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportRole":{"id":"ImportRole","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"autoscaling.amazonaws.com"}}],"Version":"2012-10-17"},"tags":[{"key":"Name","value":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":"sns:Publish","Effect":"Allow","Resource":{"Ref":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"}}],"Version":"2012-10-17"},"policyName":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicy75002F88","roles":[{"Ref":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleA38EC83B"}]}}}}}}},"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.CfnLifecycleHook","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::AutoScaling::LifecycleHook","aws:cdk:cloudformation:props":{"autoScalingGroupName":{"Ref":"EcsClusterDefaultAutoScalingGroupASGC1A785DB"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"},"roleArn":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleA38EC83B","Arn"]}}}}}}}}}},"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","path":"ecs-placement-strategies-with-strategies/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","path":"ecs-placement-strategies-with-strategies/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"TaskDef":{"id":"TaskDef","path":"ecs-placement-strategies-with-strategies/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"ecs-placement-strategies-with-strategies/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"ecs-placement-strategies-with-strategies/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/TaskDef/TaskRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"ecs-tasks.amazonaws.com"}}],"Version":"2012-10-17"}}}}}},"Resource":{"id":"Resource","path":"ecs-placement-strategies-with-strategies/TaskDef/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnTaskDefinition","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::TaskDefinition","aws:cdk:cloudformation:props":{"containerDefinitions":[{"essential":true,"image":"amazon/amazon-ecs-sample","memory":256,"name":"web"}],"family":"ecsplacementstrategieswithstrategiesTaskDef117DACB4","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"ecs-placement-strategies-with-strategies/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"Service":{"id":"Service","path":"ecs-placement-strategies-with-strategies/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"ecs-placement-strategies-with-strategies/Service/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnService","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::Service","aws:cdk:cloudformation:props":{"cluster":{"Ref":"EcsCluster97242B84"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"launchType":"EC2","placementStrategies":[{"type":"binpack","field":"CPU"},{"type":"binpack","field":"MEMORY"}],"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"ecs-placement-strategies-with-strategies/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"ecs-placement-strategies-with-strategies/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"ecs-placement-strategies-empty":{"id":"ecs-placement-strategies-empty","path":"ecs-placement-strategies-empty","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"VPC":{"id":"VPC","path":"ecs-placement-strategies-empty/VPC","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/VPC/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPC","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPC","aws:cdk:cloudformation:props":{"cidrBlock":"10.0.0.0/16","enableDnsHostnames":true,"enableDnsSupport":true,"instanceTenancy":"default","tags":[{"key":"Name","value":"ecs-placement-strategies-empty/VPC"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"ecs-placement-strategies-empty/VPC/PublicSubnet1","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PublicSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{},{"addNatGateway":["*"]}]},"children":{"Subnet":{"id":"Subnet","path":"ecs-placement-strategies-empty/VPC/PublicSubnet1/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[0,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.0.0/18","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"ecs-placement-strategies-empty/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"ecs-placement-strategies-empty/VPC/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"ecs-placement-strategies-empty/VPC/PublicSubnet1/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"ecs-placement-strategies-empty/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"ecs-placement-strategies-empty/VPC/PublicSubnet1/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPublicSubnet1RouteTableFEE4B781"},"subnetId":{"Ref":"VPCPublicSubnet1SubnetB4246D30"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"ecs-placement-strategies-empty/VPC/PublicSubnet1/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","gatewayId":{"Ref":"VPCIGWB7E252D3"},"routeTableId":{"Ref":"VPCPublicSubnet1RouteTableFEE4B781"}}}},"EIP":{"id":"EIP","path":"ecs-placement-strategies-empty/VPC/PublicSubnet1/EIP","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::EIP","aws:cdk:cloudformation:props":{"domain":"vpc","tags":[{"key":"Name","value":"ecs-placement-strategies-empty/VPC/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"ecs-placement-strategies-empty/VPC/PublicSubnet1/NATGateway","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnNatGateway","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::NatGateway","aws:cdk:cloudformation:props":{"allocationId":{"Fn::GetAtt":["VPCPublicSubnet1EIP6AD938E8","AllocationId"]},"subnetId":{"Ref":"VPCPublicSubnet1SubnetB4246D30"},"tags":[{"key":"Name","value":"ecs-placement-strategies-empty/VPC/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"ecs-placement-strategies-empty/VPC/PublicSubnet2","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PublicSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{},{"addNatGateway":["*"]}]},"children":{"Subnet":{"id":"Subnet","path":"ecs-placement-strategies-empty/VPC/PublicSubnet2/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[1,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.64.0/18","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"ecs-placement-strategies-empty/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"ecs-placement-strategies-empty/VPC/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"ecs-placement-strategies-empty/VPC/PublicSubnet2/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"ecs-placement-strategies-empty/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"ecs-placement-strategies-empty/VPC/PublicSubnet2/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPublicSubnet2RouteTable6F1A15F1"},"subnetId":{"Ref":"VPCPublicSubnet2Subnet74179F39"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"ecs-placement-strategies-empty/VPC/PublicSubnet2/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","gatewayId":{"Ref":"VPCIGWB7E252D3"},"routeTableId":{"Ref":"VPCPublicSubnet2RouteTable6F1A15F1"}}}},"EIP":{"id":"EIP","path":"ecs-placement-strategies-empty/VPC/PublicSubnet2/EIP","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::EIP","aws:cdk:cloudformation:props":{"domain":"vpc","tags":[{"key":"Name","value":"ecs-placement-strategies-empty/VPC/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"ecs-placement-strategies-empty/VPC/PublicSubnet2/NATGateway","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnNatGateway","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::NatGateway","aws:cdk:cloudformation:props":{"allocationId":{"Fn::GetAtt":["VPCPublicSubnet2EIP4947BC00","AllocationId"]},"subnetId":{"Ref":"VPCPublicSubnet2Subnet74179F39"},"tags":[{"key":"Name","value":"ecs-placement-strategies-empty/VPC/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"ecs-placement-strategies-empty/VPC/PrivateSubnet1","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PrivateSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{}]},"children":{"Subnet":{"id":"Subnet","path":"ecs-placement-strategies-empty/VPC/PrivateSubnet1/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[0,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.128.0/18","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"ecs-placement-strategies-empty/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"ecs-placement-strategies-empty/VPC/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"ecs-placement-strategies-empty/VPC/PrivateSubnet1/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"ecs-placement-strategies-empty/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"ecs-placement-strategies-empty/VPC/PrivateSubnet1/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPrivateSubnet1RouteTableBE8A6027"},"subnetId":{"Ref":"VPCPrivateSubnet1Subnet8BCA10E0"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"ecs-placement-strategies-empty/VPC/PrivateSubnet1/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","natGatewayId":{"Ref":"VPCPublicSubnet1NATGatewayE0556630"},"routeTableId":{"Ref":"VPCPrivateSubnet1RouteTableBE8A6027"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"ecs-placement-strategies-empty/VPC/PrivateSubnet2","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PrivateSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{}]},"children":{"Subnet":{"id":"Subnet","path":"ecs-placement-strategies-empty/VPC/PrivateSubnet2/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[1,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.192.0/18","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"ecs-placement-strategies-empty/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"ecs-placement-strategies-empty/VPC/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"ecs-placement-strategies-empty/VPC/PrivateSubnet2/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"ecs-placement-strategies-empty/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"ecs-placement-strategies-empty/VPC/PrivateSubnet2/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPrivateSubnet2RouteTable0A19E10E"},"subnetId":{"Ref":"VPCPrivateSubnet2SubnetCFCDAA7A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"ecs-placement-strategies-empty/VPC/PrivateSubnet2/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","natGatewayId":{"Ref":"VPCPublicSubnet2NATGateway3C070193"},"routeTableId":{"Ref":"VPCPrivateSubnet2RouteTable0A19E10E"}}}}}},"IGW":{"id":"IGW","path":"ecs-placement-strategies-empty/VPC/IGW","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnInternetGateway","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::InternetGateway","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"ecs-placement-strategies-empty/VPC"}]}}},"VPCGW":{"id":"VPCGW","path":"ecs-placement-strategies-empty/VPC/VPCGW","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPCGatewayAttachment","aws:cdk:cloudformation:props":{"internetGatewayId":{"Ref":"VPCIGWB7E252D3"},"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"ecs-placement-strategies-empty/EcsCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addCapacity":["*",{"instanceType":"*"}]},{"addAutoScalingGroup":["*",{"machineImageType":0}]}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/EcsCluster/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCluster","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::Cluster","aws:cdk:cloudformation:props":{}}},"DefaultAutoScalingGroup":{"id":"DefaultAutoScalingGroup","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","instanceType":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroup","aws:cdk:cloudformation:props":{"groupDescription":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportInstanceRole":{"id":"ImportInstanceRole","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"ec2.amazonaws.com"}}],"Version":"2012-10-17"},"tags":[{"key":"Name","value":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["ecs:DeregisterContainerInstance","ecs:RegisterContainerInstance","ecs:Submit*"],"Effect":"Allow","Resource":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"EcsClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy04DC6C80","roles":[{"Ref":"EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/InstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnInstanceProfile","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::InstanceProfile","aws:cdk:cloudformation:props":{"roles":[{"Ref":"EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.LaunchTemplate","version":"0.0.0","metadata":[{"machineImage":"*","instanceType":"*","detailedMonitoring":false,"securityGroup":"*","userData":"*","associatePublicIpAddress":"*","spotOptions":"*","blockDevices":"*","instanceProfile":"*","keyPair":"*"}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnLaunchTemplate","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::LaunchTemplate","aws:cdk:cloudformation:props":{"launchTemplateData":{"iamInstanceProfile":{"arn":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupInstanceProfile2CE606B3","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"EcsCluster97242B84"}," >> /etc/ecs/ecs.config\nsudo iptables --insert FORWARD 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP\nsudo service iptables save\necho ECS_AWSVPC_BLOCK_IMDS=true >> /etc/ecs/ecs.config"]]}}},"tagSpecifications":[{"resourceType":"launch-template","tags":[{"key":"Name","value":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::AutoScaling::AutoScalingGroup","aws:cdk:cloudformation:props":{"launchTemplate":{"launchTemplateId":{"Ref":"EcsClusterDefaultAutoScalingGroupLaunchTemplate3719972A"},"version":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupLaunchTemplate3719972A","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VPCPrivateSubnet1Subnet8BCA10E0"},{"Ref":"VPCPrivateSubnet2SubnetCFCDAA7A"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"0.0.0","metadata":[{"code":"*","handler":"*","runtime":"*","timeout":"*","environment":"*"},{"addEnvironment":["*","*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]]}],"tags":[{"key":"Name","value":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["ec2:DescribeHosts","ec2:DescribeInstanceAttribute","ec2:DescribeInstanceStatus","ec2:DescribeInstances"],"Effect":"Allow","Resource":"*"},{"Action":"autoscaling:CompleteLifecycleAction","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":autoscaling:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":autoScalingGroup:*:autoScalingGroupName/",{"Ref":"EcsClusterDefaultAutoScalingGroupASGC1A785DB"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]}}],"Version":"2012-10-17"},"policyName":"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicyA45BF396","roles":[{"Ref":"EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA"}]}}}}}}},"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Function","aws:cdk:cloudformation:props":{"code":{"zipFile":"import boto3, json, os, time\n\necs = boto3.client('ecs')\nautoscaling = boto3.client('autoscaling')\n\n\ndef lambda_handler(event, context):\n print(json.dumps(dict(event, ResponseURL='...')))\n cluster = os.environ['CLUSTER']\n snsTopicArn = event['Records'][0]['Sns']['TopicArn']\n lifecycle_event = json.loads(event['Records'][0]['Sns']['Message'])\n instance_id = lifecycle_event.get('EC2InstanceId')\n if not instance_id:\n print(f\"Got event without EC2InstanceId: { json.dumps(dict(event, ResponseURL='...')) }\")\n return\n\n instance_arn = container_instance_arn(cluster, instance_id)\n print('Instance %s has container instance ARN %s' % (lifecycle_event['EC2InstanceId'], instance_arn))\n\n if not instance_arn:\n return\n\n task_arns = container_instance_task_arns(cluster, instance_arn)\n\n if task_arns:\n print('Instance ARN %s has task ARNs %s' % (instance_arn, ', '.join(task_arns)))\n\n while has_tasks(cluster, instance_arn, task_arns):\n time.sleep(10)\n\n try:\n print('Terminating instance %s' % instance_id)\n autoscaling.complete_lifecycle_action(\n LifecycleActionResult='CONTINUE',\n **pick(lifecycle_event, 'LifecycleHookName', 'LifecycleActionToken', 'AutoScalingGroupName'))\n except Exception as e:\n # Lifecycle action may have already completed.\n print(str(e))\n\n\ndef container_instance_arn(cluster, instance_id):\n \"\"\"Turn an instance ID into a container instance ARN.\"\"\"\n arns = ecs.list_container_instances(cluster=cluster, filter='ec2InstanceId==' + instance_id)['containerInstanceArns']\n if not arns:\n return None\n return arns[0]\n\ndef container_instance_task_arns(cluster, instance_arn):\n \"\"\"Fetch tasks for a container instance ARN.\"\"\"\n arns = ecs.list_tasks(cluster=cluster, containerInstance=instance_arn)['taskArns']\n return arns\n\ndef has_tasks(cluster, instance_arn, task_arns):\n \"\"\"Return True if the instance is running tasks for the given cluster.\"\"\"\n instances = ecs.describe_container_instances(cluster=cluster, containerInstances=[instance_arn])['containerInstances']\n if not instances:\n return False\n instance = instances[0]\n\n if instance['status'] == 'ACTIVE':\n # Start draining, then try again later\n set_container_instance_to_draining(cluster, instance_arn)\n return True\n\n task_count = None\n\n if task_arns:\n # Fetch details for tasks running on the container instance\n tasks = ecs.describe_tasks(cluster=cluster, tasks=task_arns)['tasks']\n if tasks:\n # Consider any non-stopped tasks as running\n task_count = sum(task['lastStatus'] != 'STOPPED' for task in tasks) + instance['pendingTasksCount']\n\n if not task_count:\n # Fallback to instance task counts if detailed task information is unavailable\n task_count = instance['runningTasksCount'] + instance['pendingTasksCount']\n\n print('Instance %s has %s tasks' % (instance_arn, task_count))\n\n return task_count > 0\n\ndef set_container_instance_to_draining(cluster, instance_arn):\n ecs.update_container_instances_state(\n cluster=cluster,\n containerInstances=[instance_arn], status='DRAINING')\n\n\ndef pick(dct, *keys):\n \"\"\"Pick a subset of a dict.\"\"\"\n return {k: v for k, v in dct.items() if k in keys}\n"},"environment":{"variables":{"CLUSTER":{"Ref":"EcsCluster97242B84"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole94543EDA","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:ecsplacementstrategiesemptyEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0BAEDEAB":{"id":"AllowInvoke:ecsplacementstrategiesemptyEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0BAEDEAB","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:ecsplacementstrategiesemptyEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0BAEDEAB","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"}}}},"Topic":{"id":"Topic","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Subscription","version":"0.0.0","metadata":[{"topic":"*","endpoint":"*","protocol":"lambda","filterPolicy":"*","filterPolicyWithMessageBody":"*","region":"*","deadLetterQueue":"*"}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.CfnSubscription","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Subscription","aws:cdk:cloudformation:props":{"endpoint":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E","Arn"]},"protocol":"lambda","topicArn":{"Ref":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.LifecycleHook","version":"0.0.0","metadata":[{"autoScalingGroup":"*","lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","defaultResult":"CONTINUE","notificationTarget":"*","heartbeatTimeout":"*"}]},"children":{"Topic":{"id":"Topic","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.CfnTopic","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Topic","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportRole":{"id":"ImportRole","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"autoscaling.amazonaws.com"}}],"Version":"2012-10-17"},"tags":[{"key":"Name","value":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":"sns:Publish","Effect":"Allow","Resource":{"Ref":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"}}],"Version":"2012-10-17"},"policyName":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicy75002F88","roles":[{"Ref":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleA38EC83B"}]}}}}}}},"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.CfnLifecycleHook","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::AutoScaling::LifecycleHook","aws:cdk:cloudformation:props":{"autoScalingGroupName":{"Ref":"EcsClusterDefaultAutoScalingGroupASGC1A785DB"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"},"roleArn":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleA38EC83B","Arn"]}}}}}}}}}},"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","path":"ecs-placement-strategies-empty/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","path":"ecs-placement-strategies-empty/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"TaskDef":{"id":"TaskDef","path":"ecs-placement-strategies-empty/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"ecs-placement-strategies-empty/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"ecs-placement-strategies-empty/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/TaskDef/TaskRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"ecs-tasks.amazonaws.com"}}],"Version":"2012-10-17"}}}}}},"Resource":{"id":"Resource","path":"ecs-placement-strategies-empty/TaskDef/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnTaskDefinition","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::TaskDefinition","aws:cdk:cloudformation:props":{"containerDefinitions":[{"essential":true,"image":"amazon/amazon-ecs-sample","memory":256,"name":"web"}],"family":"ecsplacementstrategiesemptyTaskDefB57677EF","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"ecs-placement-strategies-empty/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"Service":{"id":"Service","path":"ecs-placement-strategies-empty/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"ecs-placement-strategies-empty/Service/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnService","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::Service","aws:cdk:cloudformation:props":{"cluster":{"Ref":"EcsCluster97242B84"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"launchType":"EC2","placementStrategies":[],"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"ecs-placement-strategies-empty/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"ecs-placement-strategies-empty/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"LambdaTest":{"id":"LambdaTest","path":"LambdaTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"LambdaTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"LambdaTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"LambdaTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"LambdaTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"LambdaTest/DefaultTest/DeployAssert/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}}}}}},"Tree":{"id":"Tree","path":"Tree","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}}} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.ts index 67169c7651da4..c95b6a22426aa 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.ts @@ -2,6 +2,7 @@ import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as ecs from 'aws-cdk-lib/aws-ecs'; +import * as integ from '@aws-cdk/integ-tests-alpha'; const app = new cdk.App({ postCliContext: { @@ -12,24 +13,29 @@ const app = new cdk.App({ }, }); -class EcsStack extends cdk.Stack { - constructor(scope: Construct, id: string, props?: cdk.StackProps) { - super(scope, id, props); - +class BaseEcsStack extends cdk.Stack { + protected createBaseResources() { const vpc = new ec2.Vpc(this, 'VPC', { restrictDefaultSecurityGroup: false }); - const cluster = new ecs.Cluster(this, 'EcsCluster', { vpc }); cluster.addCapacity('DefaultAutoScalingGroup', { instanceType: ec2.InstanceType.of(ec2.InstanceClass.T2, ec2.InstanceSize.MICRO), }); - const taskDefinition = new ecs.Ec2TaskDefinition(this, 'TaskDef'); taskDefinition.addContainer('web', { image: ecs.ContainerImage.fromRegistry('amazon/amazon-ecs-sample'), memoryLimitMiB: 256, }); + return { vpc, cluster, taskDefinition }; + } +} + +// Test service with multiple placement strategies +class EcsWithStrategiesStack extends BaseEcsStack { + constructor(scope: Construct, id: string, props?: cdk.StackProps) { + super(scope, id, props); + const { cluster, taskDefinition } = this.createBaseResources(); - new ecs.Ec2Service(this, 'Test_Stack', { + new ecs.Ec2Service(this, 'Service', { cluster, taskDefinition, placementStrategies: [ @@ -40,6 +46,24 @@ class EcsStack extends cdk.Stack { } } -new EcsStack(app, 'aws-cdk-ecs-integration-test-stack'); +// Test service with empty placement strategies +class EcsWithEmptyStrategiesStack extends BaseEcsStack { + constructor(scope: Construct, id: string, props?: cdk.StackProps) { + super(scope, id, props); + const { cluster, taskDefinition } = this.createBaseResources(); + + new ecs.Ec2Service(this, 'Service', { + cluster, + taskDefinition, + placementStrategies: [], + }); + } +} +new integ.IntegTest(app, 'LambdaTest', { + testCases: [ + new EcsWithStrategiesStack(app, 'ecs-placement-strategies-with-strategies'), + new EcsWithEmptyStrategiesStack(app, 'ecs-placement-strategies-empty'), + ], +}); app.synth(); diff --git a/packages/aws-cdk-lib/aws-ecs/lib/ec2/ec2-service.ts b/packages/aws-cdk-lib/aws-ecs/lib/ec2/ec2-service.ts index 414ab7cea1df0..1cb41562ea7ac 100644 --- a/packages/aws-cdk-lib/aws-ecs/lib/ec2/ec2-service.ts +++ b/packages/aws-cdk-lib/aws-ecs/lib/ec2/ec2-service.ts @@ -163,7 +163,7 @@ export class Ec2Service extends BaseService implements IEc2Service { } private constraints?: CfnService.PlacementConstraintProperty[]; - private readonly strategies: CfnService.PlacementStrategyProperty[]; + private strategies?: CfnService.PlacementStrategyProperty[]; private readonly daemon: boolean; private readonly availabilityZoneRebalancingEnabled: boolean; @@ -212,15 +212,13 @@ export class Ec2Service extends BaseService implements IEc2Service { cluster: props.cluster.clusterName, taskDefinition: props.deploymentController?.type === DeploymentControllerType.EXTERNAL ? undefined : props.taskDefinition.taskDefinitionArn, placementConstraints: Lazy.any({ produce: () => this.constraints }), - placementStrategies: Lazy.any({ produce: () => this.strategies }, { omitEmptyArray: true }), + placementStrategies: Lazy.any({ produce: () => this.strategies }), schedulingStrategy: props.daemon ? 'DAEMON' : 'REPLICA', availabilityZoneRebalancing: props.availabilityZoneRebalancing, }, props.taskDefinition); // Enhanced CDK Analytics Telemetry addConstructMetadata(this, props); - this.constraints = undefined; - this.strategies = []; this.daemon = props.daemon || false; this.availabilityZoneRebalancingEnabled = props.availabilityZoneRebalancing === AvailabilityZoneRebalancing.ENABLED; @@ -249,7 +247,9 @@ export class Ec2Service extends BaseService implements IEc2Service { if (props.placementConstraints) { this.addPlacementConstraints(...props.placementConstraints); } - this.addPlacementStrategies(...props.placementStrategies || []); + if (props.placementStrategies) { + this.addPlacementStrategies(...props.placementStrategies); + } this.node.addValidation({ validate: () => !this.taskDefinition.defaultContainer ? ['A TaskDefinition must have at least one essential container'] : [], @@ -267,19 +267,22 @@ export class Ec2Service extends BaseService implements IEc2Service { * [Amazon ECS Task Placement Strategies](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-strategies.html). */ @MethodMetadata() - public addPlacementStrategies(...strategies: PlacementStrategy[]) { - if (strategies.length > 0 && this.daemon) { + public addPlacementStrategies(...newStrategies: PlacementStrategy[]) { + if (newStrategies.length > 0 && this.daemon) { throw new ValidationError("Can't configure placement strategies when daemon=true", this); } - if (strategies.length > 0 && this.strategies.length === 0 && this.availabilityZoneRebalancingEnabled) { - const [placement] = strategies[0].toJson(); + if (newStrategies.length > 0 && !this.strategies && this.availabilityZoneRebalancingEnabled) { + const [placement] = newStrategies[0].toJson(); if (placement.type !== 'spread' || placement.field !== BuiltInAttributes.AVAILABILITY_ZONE) { throw new ValidationError(`AvailabilityZoneBalancing.ENABLED requires that the first placement strategy, if any, be 'spread across "${BuiltInAttributes.AVAILABILITY_ZONE}"'`, this); } } - for (const strategy of strategies) { + if (!this.strategies) { + this.strategies = []; + } + for (const strategy of newStrategies) { this.strategies.push(...strategy.toJson()); } } diff --git a/packages/aws-cdk-lib/aws-ecs/test/ec2/ec2-service.test.ts b/packages/aws-cdk-lib/aws-ecs/test/ec2/ec2-service.test.ts index 82475731bbc02..b9ffc8a90fd95 100644 --- a/packages/aws-cdk-lib/aws-ecs/test/ec2/ec2-service.test.ts +++ b/packages/aws-cdk-lib/aws-ecs/test/ec2/ec2-service.test.ts @@ -2307,6 +2307,31 @@ describe('ec2 service', () => { }); }); + test('with empty [] placement strategies', () => { + // GIVEN + const stack = new cdk.Stack(); + const vpc = new ec2.Vpc(stack, 'MyVpc', {}); + const cluster = new ecs.Cluster(stack, 'EcsCluster', { vpc }); + addDefaultCapacityProvider(cluster, stack, vpc); + const taskDefinition = new ecs.Ec2TaskDefinition(stack, 'Ec2TaskDef'); + + taskDefinition.addContainer('web', { + image: ecs.ContainerImage.fromRegistry('amazon/amazon-ecs-sample'), + memoryLimitMiB: 512, + }); + + new ecs.Ec2Service(stack, 'Ec2Service', { + cluster, + taskDefinition, + placementStrategies: [], + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::ECS::Service', { + PlacementStrategies: Match.arrayEquals([]), + }); + }); + testDeprecated('with both propagateTags and propagateTaskTagsFrom defined', () => { // GIVEN const stack = new cdk.Stack();