diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/aws-ecs-integ-alb-idle-timeout.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/aws-ecs-integ-alb-idle-timeout.assets.json
index 1fa0f6d325310..1ce6c612de7ef 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/aws-ecs-integ-alb-idle-timeout.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/aws-ecs-integ-alb-idle-timeout.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "8c5da65feb338dfb74c2d52ee74522b2203e34d53d84402a42273f369ab33858": {
+ "202c7f15309f790f5700c701552a0b740da7ba962b70a8f74ffcfcd44e29cf35": {
+ "displayName": "aws-ecs-integ-alb-idle-timeout Template",
"source": {
"path": "aws-ecs-integ-alb-idle-timeout.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-70edc71a": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "8c5da65feb338dfb74c2d52ee74522b2203e34d53d84402a42273f369ab33858.json",
+ "objectKey": "202c7f15309f790f5700c701552a0b740da7ba962b70a8f74ffcfcd44e29cf35.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/aws-ecs-integ-alb-idle-timeout.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/aws-ecs-integ-alb-idle-timeout.template.json
index c94645570fa22..8da5674ce4184 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/aws-ecs-integ-alb-idle-timeout.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/aws-ecs-integ-alb-idle-timeout.template.json
@@ -754,7 +754,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -770,7 +770,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/integ.json
index cbeec97b5dff2..833098d79170a 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"multiAlbEcsEc2Test/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "multiAlbEcsEc2Test/DefaultTest/DeployAssert",
"assertionStackName": "multiAlbEcsEc2TestDefaultTestDeployAssertE5F6E3B0"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/manifest.json
index 6067295d920ce..af4277f63fe07 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ-alb-idle-timeout.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/8c5da65feb338dfb74c2d52ee74522b2203e34d53d84402a42273f369ab33858.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/202c7f15309f790f5700c701552a0b740da7ba962b70a8f74ffcfcd44e29cf35.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1601,51 +1601,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole02E489EC0": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole02E489EC0",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole13AF1063A": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole13AF1063A",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole2D53500AD": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole2D53500AD",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole386EBB933": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole386EBB933",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4F316D036": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4F316D036",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ-alb-idle-timeout"
@@ -1703,6 +1658,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/multiAlbEcsEc2TestDefaultTestDeployAssertE5F6E3B0.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/multiAlbEcsEc2TestDefaultTestDeployAssertE5F6E3B0.assets.json
index fa76c89e09687..4e0488b110d68 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/multiAlbEcsEc2TestDefaultTestDeployAssertE5F6E3B0.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/multiAlbEcsEc2TestDefaultTestDeployAssertE5F6E3B0.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "multiAlbEcsEc2TestDefaultTestDeployAssertE5F6E3B0 Template",
"source": {
"path": "multiAlbEcsEc2TestDefaultTestDeployAssertE5F6E3B0.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/tree.json
index 516963b904f79..9b8e08aa30116 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service-idle-timeout.js.snapshot/tree.json
@@ -1,3341 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ-alb-idle-timeout": {
- "id": "aws-ecs-integ-alb-idle-timeout",
- "path": "aws-ecs-integ-alb-idle-timeout",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/Resource",
- "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-ecs-integ-alb-idle-timeout/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-alb-idle-timeout/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ-alb-idle-timeout/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "HostedZone": {
- "id": "HostedZone",
- "path": "aws-ecs-integ-alb-idle-timeout/HostedZone",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/HostedZone/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Route53::HostedZone",
- "aws:cdk:cloudformation:props": {
- "name": "example.com."
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_route53.CfnHostedZone",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_route53.PublicHostedZone",
- "version": "0.0.0",
- "metadata": [
- {
- "zoneName": "*"
- },
- {
- "zoneName": "*"
- }
- ]
- }
- },
- "Cluster": {
- "id": "Cluster",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- },
- "from awsecsintegalbidletimeoutmyServicelb1SecurityGroup378D68EF:32768-65535": {
- "id": "from awsecsintegalbidletimeoutmyServicelb1SecurityGroup378D68EF:32768-65535",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup/from awsecsintegalbidletimeoutmyServicelb1SecurityGroup378D68EF:32768-65535",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupIngress",
- "aws:cdk:cloudformation:props": {
- "description": "Load balancer to target",
- "fromPort": 32768,
- "groupId": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A",
- "GroupId"
- ]
- },
- "ipProtocol": "tcp",
- "sourceSecurityGroupId": {
- "Fn::GetAtt": [
- "myServicelb1SecurityGroup342C51EA",
- "GroupId"
- ]
- },
- "toPort": 65535
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress",
- "version": "0.0.0"
- }
- },
- "from awsecsintegalbidletimeoutmyServicelb2SecurityGroupE659E2B0:32768-65535": {
- "id": "from awsecsintegalbidletimeoutmyServicelb2SecurityGroupE659E2B0:32768-65535",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup/from awsecsintegalbidletimeoutmyServicelb2SecurityGroupE659E2B0:32768-65535",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupIngress",
- "aws:cdk:cloudformation:props": {
- "description": "Load balancer to target",
- "fromPort": 32768,
- "groupId": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A",
- "GroupId"
- ]
- },
- "ipProtocol": "tcp",
- "sourceSecurityGroupId": {
- "Fn::GetAtt": [
- "myServicelb2SecurityGroupEB00B5B9",
- "GroupId"
- ]
- },
- "toPort": 65535
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- },
- {
- "addIngressRule": [
- "*",
- {},
- "*",
- false
- ]
- },
- {
- "addIngressRule": [
- "*",
- {},
- "*",
- false
- ]
- },
- {
- "addIngressRule": [
- "*",
- {},
- "*",
- false
- ]
- },
- {
- "addIngressRule": [
- "*",
- {},
- "*",
- false
- ]
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- },
- {
- "Action": [
- "ecs:Poll",
- "ecs:StartTelemetrySession"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecr:GetAuthorizationToken",
- "ecs:DiscoverPollEndpoint",
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy06157A81",
- "roles": [
- {
- "Ref": "ClusterDefaultAutoScalingGroupInstanceRole9A14B384"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "ClusterDefaultAutoScalingGroupInstanceRole9A14B384"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "LaunchConfig": {
- "id": "LaunchConfig",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/LaunchConfig",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LaunchConfiguration",
- "aws:cdk:cloudformation:props": {
- "iamInstanceProfile": {
- "Ref": "ClusterDefaultAutoScalingGroupInstanceProfile2BB4FE55"
- },
- "imageId": {
- "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "t2.micro",
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A",
- "GroupId"
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "#!/bin/bash\necho ECS_CLUSTER=",
- {
- "Ref": "ClusterEB0386A7"
- },
- " >> /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"
- ]
- ]
- }
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLaunchConfiguration",
- "version": "0.0.0"
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "launchConfigurationName": {
- "Ref": "ClusterDefaultAutoScalingGroupLaunchConfig81EA5466"
- },
- "maxSize": "1",
- "minSize": "1",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "ClusterDefaultAutoScalingGroupASG0F98E147"
- }
- ]
- ]
- }
- },
- {
- "Action": [
- "ecs:DescribeContainerInstances",
- "ecs:DescribeTasks",
- "ecs:ListTasks",
- "ecs:UpdateContainerInstancesState"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecs:ListContainerInstances",
- "ecs:SubmitContainerStateChange",
- "ecs:SubmitTaskStateChange"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicy221F6E5E",
- "roles": [
- {
- "Ref": "ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole2AC250B1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": "ClusterEB0386A7"
- }
- }
- },
- "handler": "index.lambda_handler",
- "role": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole2AC250B1",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicB6B50466": {
- "id": "AllowInvoke:awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicB6B50466",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicB6B50466",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctionFE918865",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctionFE918865",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicyFFFD6EA5",
- "roles": [
- {
- "Ref": "ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole70201663"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "ClusterDefaultAutoScalingGroupASG0F98E147"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole70201663",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/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": []
- }
- },
- "Cert": {
- "id": "Cert",
- "path": "aws-ecs-integ-alb-idle-timeout/Cert",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "Cert2": {
- "id": "Cert2",
- "path": "aws-ecs-integ-alb-idle-timeout/Cert2",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "myService": {
- "id": "myService",
- "path": "aws-ecs-integ-alb-idle-timeout/myService",
- "children": {
- "lb1": {
- "id": "lb1",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb1",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb1/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
- "aws:cdk:cloudformation:props": {
- "loadBalancerAttributes": [
- {
- "key": "deletion_protection.enabled",
- "value": "false"
- },
- {
- "key": "idle_timeout.timeout_seconds",
- "value": "5"
- }
- ],
- "name": "lb1",
- "scheme": "internet-facing",
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "myServicelb1SecurityGroup342C51EA",
- "GroupId"
- ]
- }
- ],
- "subnets": [
- {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- ],
- "type": "application"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnLoadBalancer",
- "version": "0.0.0"
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb1/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb1/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "Automatically created Security Group for ELB awsecsintegalbidletimeoutmyServicelb1D1305870",
- "securityGroupIngress": [
- {
- "cidrIp": "0.0.0.0/0",
- "ipProtocol": "tcp",
- "fromPort": 443,
- "toPort": 443,
- "description": "Allow from anyone on port 443"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- },
- "to awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupInstanceSecurityGroup9C8FC9DE:32768-65535": {
- "id": "to awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupInstanceSecurityGroup9C8FC9DE:32768-65535",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb1/SecurityGroup/to awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupInstanceSecurityGroup9C8FC9DE:32768-65535",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupEgress",
- "aws:cdk:cloudformation:props": {
- "description": "Load balancer to target",
- "destinationSecurityGroupId": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A",
- "GroupId"
- ]
- },
- "fromPort": 32768,
- "groupId": {
- "Fn::GetAtt": [
- "myServicelb1SecurityGroup342C51EA",
- "GroupId"
- ]
- },
- "ipProtocol": "tcp",
- "toPort": 65535
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupEgress",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "description": "*",
- "allowAllOutbound": false
- },
- {
- "addIngressRule": [
- {
- "canInlineRule": true,
- "connections": "*",
- "uniqueId": "*"
- },
- {},
- "*",
- false
- ]
- },
- {
- "addEgressRule": [
- "*",
- {},
- "*",
- true
- ]
- },
- {
- "addEgressRule": [
- "*",
- {},
- "*",
- true
- ]
- }
- ]
- }
- },
- "listener": {
- "id": "listener",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb1/listener",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb1/listener/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::Listener",
- "aws:cdk:cloudformation:props": {
- "certificates": [
- {
- "certificateArn": "helloworld"
- }
- ],
- "defaultActions": [
- {
- "type": "forward",
- "targetGroupArn": {
- "Ref": "myServicelb1listenerECSTargetGroupweb80Group6EDAD1E5"
- }
- }
- ],
- "loadBalancerArn": {
- "Ref": "myServicelb1FA8CBE12"
- },
- "port": 443,
- "protocol": "HTTPS",
- "sslPolicy": "ELBSecurityPolicy-TLS-1-2-Ext-2018-06"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnListener",
- "version": "0.0.0"
- }
- },
- "ECSTargetGroupweb80Group": {
- "id": "ECSTargetGroupweb80Group",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb1/listener/ECSTargetGroupweb80Group",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb1/listener/ECSTargetGroupweb80Group/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::TargetGroup",
- "aws:cdk:cloudformation:props": {
- "port": 80,
- "protocol": "HTTP",
- "targetGroupAttributes": [
- {
- "key": "stickiness.enabled",
- "value": "false"
- }
- ],
- "targetType": "instance",
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup",
- "version": "0.0.0"
- }
- },
- "ECSTargetGroupweb90Group": {
- "id": "ECSTargetGroupweb90Group",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb1/listener/ECSTargetGroupweb90Group",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb1/listener/ECSTargetGroupweb90Group/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::TargetGroup",
- "aws:cdk:cloudformation:props": {
- "port": 80,
- "protocol": "HTTP",
- "targetGroupAttributes": [
- {
- "key": "stickiness.enabled",
- "value": "false"
- }
- ],
- "targetType": "instance",
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup",
- "version": "0.0.0"
- }
- },
- "ECSTargetGroupweb90Rule": {
- "id": "ECSTargetGroupweb90Rule",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb1/listener/ECSTargetGroupweb90Rule",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb1/listener/ECSTargetGroupweb90Rule/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::ListenerRule",
- "aws:cdk:cloudformation:props": {
- "actions": [
- {
- "type": "forward",
- "targetGroupArn": {
- "Ref": "myServicelb1listenerECSTargetGroupweb90Group392113A5"
- }
- }
- ],
- "conditions": [
- {
- "field": "path-pattern",
- "pathPatternConfig": {
- "values": [
- "a/b/c"
- ]
- }
- }
- ],
- "listenerArn": {
- "Ref": "myServicelb1listener94ADDDDF"
- },
- "priority": 10
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnListenerRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListenerRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListener",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationLoadBalancer",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "DNSlb1": {
- "id": "DNSlb1",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/DNSlb1",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/DNSlb1/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Route53::RecordSet",
- "aws:cdk:cloudformation:props": {
- "aliasTarget": {
- "hostedZoneId": {
- "Fn::GetAtt": [
- "myServicelb1FA8CBE12",
- "CanonicalHostedZoneID"
- ]
- },
- "dnsName": {
- "Fn::Join": [
- "",
- [
- "dualstack.",
- {
- "Fn::GetAtt": [
- "myServicelb1FA8CBE12",
- "DNSName"
- ]
- }
- ]
- ]
- }
- },
- "hostedZoneId": {
- "Ref": "HostedZoneDB99F866"
- },
- "name": "api.example.com.",
- "type": "A"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_route53.CfnRecordSet",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_route53.ARecord",
- "version": "0.0.0",
- "metadata": [
- {
- "zone": "*",
- "recordName": "*",
- "target": "*"
- },
- {
- "zone": "*",
- "recordName": "*",
- "target": "*"
- }
- ]
- }
- },
- "LoadBalancerDNSlb1": {
- "id": "LoadBalancerDNSlb1",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/LoadBalancerDNSlb1",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "ServiceURLlb1https": {
- "id": "ServiceURLlb1https",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/ServiceURLlb1https",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "lb2": {
- "id": "lb2",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb2",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb2/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
- "aws:cdk:cloudformation:props": {
- "loadBalancerAttributes": [
- {
- "key": "deletion_protection.enabled",
- "value": "false"
- },
- {
- "key": "idle_timeout.timeout_seconds",
- "value": "500"
- }
- ],
- "name": "lb2",
- "scheme": "internet-facing",
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "myServicelb2SecurityGroupEB00B5B9",
- "GroupId"
- ]
- }
- ],
- "subnets": [
- {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- ],
- "type": "application"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnLoadBalancer",
- "version": "0.0.0"
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb2/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb2/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "Automatically created Security Group for ELB awsecsintegalbidletimeoutmyServicelb227337DD9",
- "securityGroupIngress": [
- {
- "cidrIp": "0.0.0.0/0",
- "ipProtocol": "tcp",
- "fromPort": 443,
- "toPort": 443,
- "description": "Allow from anyone on port 443"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- },
- "to awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupInstanceSecurityGroup9C8FC9DE:32768-65535": {
- "id": "to awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupInstanceSecurityGroup9C8FC9DE:32768-65535",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb2/SecurityGroup/to awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupInstanceSecurityGroup9C8FC9DE:32768-65535",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupEgress",
- "aws:cdk:cloudformation:props": {
- "description": "Load balancer to target",
- "destinationSecurityGroupId": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A",
- "GroupId"
- ]
- },
- "fromPort": 32768,
- "groupId": {
- "Fn::GetAtt": [
- "myServicelb2SecurityGroupEB00B5B9",
- "GroupId"
- ]
- },
- "ipProtocol": "tcp",
- "toPort": 65535
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupEgress",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "description": "*",
- "allowAllOutbound": false
- },
- {
- "addIngressRule": [
- {
- "canInlineRule": true,
- "connections": "*",
- "uniqueId": "*"
- },
- {},
- "*",
- false
- ]
- },
- {
- "addEgressRule": [
- "*",
- {},
- "*",
- true
- ]
- },
- {
- "addEgressRule": [
- "*",
- {},
- "*",
- true
- ]
- }
- ]
- }
- },
- "listener2": {
- "id": "listener2",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::Listener",
- "aws:cdk:cloudformation:props": {
- "certificates": [
- {
- "certificateArn": "helloworld"
- }
- ],
- "defaultActions": [
- {
- "type": "forward",
- "targetGroupArn": {
- "Ref": "myServicelb2listener2ECSTargetGroupweb443Group8FAB1268"
- }
- }
- ],
- "loadBalancerArn": {
- "Ref": "myServicelb2C84C7BCB"
- },
- "port": 443,
- "protocol": "HTTPS",
- "sslPolicy": "ELBSecurityPolicy-TLS-1-2-Ext-2018-06"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnListener",
- "version": "0.0.0"
- }
- },
- "ECSTargetGroupweb443Group": {
- "id": "ECSTargetGroupweb443Group",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2/ECSTargetGroupweb443Group",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2/ECSTargetGroupweb443Group/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::TargetGroup",
- "aws:cdk:cloudformation:props": {
- "port": 80,
- "protocol": "HTTP",
- "targetGroupAttributes": [
- {
- "key": "stickiness.enabled",
- "value": "false"
- }
- ],
- "targetType": "instance",
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup",
- "version": "0.0.0"
- }
- },
- "ECSTargetGroupweb80Group": {
- "id": "ECSTargetGroupweb80Group",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2/ECSTargetGroupweb80Group",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2/ECSTargetGroupweb80Group/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::TargetGroup",
- "aws:cdk:cloudformation:props": {
- "port": 80,
- "protocol": "HTTP",
- "targetGroupAttributes": [
- {
- "key": "stickiness.enabled",
- "value": "false"
- }
- ],
- "targetType": "instance",
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup",
- "version": "0.0.0"
- }
- },
- "ECSTargetGroupweb80Rule": {
- "id": "ECSTargetGroupweb80Rule",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2/ECSTargetGroupweb80Rule",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2/ECSTargetGroupweb80Rule/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::ListenerRule",
- "aws:cdk:cloudformation:props": {
- "actions": [
- {
- "type": "forward",
- "targetGroupArn": {
- "Ref": "myServicelb2listener2ECSTargetGroupweb80Group0590BDE6"
- }
- }
- ],
- "conditions": [
- {
- "field": "path-pattern",
- "pathPatternConfig": {
- "values": [
- "a/b/c"
- ]
- }
- }
- ],
- "listenerArn": {
- "Ref": "myServicelb2listener2AA6970EB"
- },
- "priority": 10
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnListenerRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListenerRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListener",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationLoadBalancer",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "DNSlb2": {
- "id": "DNSlb2",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/DNSlb2",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/DNSlb2/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Route53::RecordSet",
- "aws:cdk:cloudformation:props": {
- "aliasTarget": {
- "hostedZoneId": {
- "Fn::GetAtt": [
- "myServicelb2C84C7BCB",
- "CanonicalHostedZoneID"
- ]
- },
- "dnsName": {
- "Fn::Join": [
- "",
- [
- "dualstack.",
- {
- "Fn::GetAtt": [
- "myServicelb2C84C7BCB",
- "DNSName"
- ]
- }
- ]
- ]
- }
- },
- "hostedZoneId": {
- "Ref": "HostedZoneDB99F866"
- },
- "name": "frontend.example.com.",
- "type": "A"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_route53.CfnRecordSet",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_route53.ARecord",
- "version": "0.0.0",
- "metadata": [
- {
- "zone": "*",
- "recordName": "*",
- "target": "*"
- },
- {
- "zone": "*",
- "recordName": "*",
- "target": "*"
- }
- ]
- }
- },
- "LoadBalancerDNSlb2": {
- "id": "LoadBalancerDNSlb2",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/LoadBalancerDNSlb2",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "ServiceURLlb2https": {
- "id": "ServiceURLlb2https",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/ServiceURLlb2https",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "TaskDef": {
- "id": "TaskDef",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/TaskDef/TaskRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/TaskDef/TaskRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:DescribeLogGroups",
- "logs:DescribeLogStreams",
- "logs:PutLogEvents",
- "ssmmessages:CreateControlChannel",
- "ssmmessages:CreateDataChannel",
- "ssmmessages:OpenControlChannel",
- "ssmmessages:OpenDataChannel"
- ],
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "myServiceTaskDefTaskRoleDefaultPolicyD48473C0",
- "roles": [
- {
- "Ref": "myServiceTaskDefTaskRole1C1DE6CC"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "memory": 256,
- "name": "web",
- "portMappings": [
- {
- "containerPort": 80,
- "hostPort": 0,
- "protocol": "tcp"
- },
- {
- "containerPort": 90,
- "hostPort": 0,
- "protocol": "tcp"
- },
- {
- "containerPort": 443,
- "hostPort": 0,
- "protocol": "tcp"
- }
- ],
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": {
- "Ref": "myServiceTaskDefwebLogGroupA1767F2C"
- },
- "awslogs-stream-prefix": "myService",
- "awslogs-region": {
- "Ref": "AWS::Region"
- }
- }
- }
- }
- ],
- "executionRoleArn": {
- "Fn::GetAtt": [
- "myServiceTaskDefExecutionRole618CD311",
- "Arn"
- ]
- },
- "family": "awsecsintegalbidletimeoutmyServiceTaskDef954405E6",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "myServiceTaskDefTaskRole1C1DE6CC",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "web": {
- "id": "web",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/TaskDef/web",
- "children": {
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/TaskDef/web/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/TaskDef/web/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "retention": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/TaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/TaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/TaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/TaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/TaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "myServiceTaskDefwebLogGroupA1767F2C",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "myServiceTaskDefExecutionRoleDefaultPolicyBDAEC571",
- "roles": [
- {
- "Ref": "myServiceTaskDefExecutionRole618CD311"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- },
- "roleName": "*"
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*"
- ]
- }
- },
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/Service",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-alb-idle-timeout/myService/Service/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "ClusterEB0386A7"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50,
- "alarms": {
- "alarmNames": [],
- "enable": false,
- "rollback": false
- }
- },
- "enableEcsManagedTags": false,
- "enableExecuteCommand": true,
- "healthCheckGracePeriodSeconds": 60,
- "launchType": "EC2",
- "loadBalancers": [
- {
- "targetGroupArn": {
- "Ref": "myServicelb1listenerECSTargetGroupweb80Group6EDAD1E5"
- },
- "containerName": "web",
- "containerPort": 80
- },
- {
- "targetGroupArn": {
- "Ref": "myServicelb1listenerECSTargetGroupweb90Group392113A5"
- },
- "containerName": "web",
- "containerPort": 90
- },
- {
- "targetGroupArn": {
- "Ref": "myServicelb2listener2ECSTargetGroupweb443Group8FAB1268"
- },
- "containerName": "web",
- "containerPort": 443
- },
- {
- "targetGroupArn": {
- "Ref": "myServicelb2listener2ECSTargetGroupweb80Group0590BDE6"
- },
- "containerName": "web",
- "containerPort": 80
- }
- ],
- "schedulingStrategy": "REPLICA",
- "taskDefinition": {
- "Ref": "myServiceTaskDef7FB8322A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs_patterns.ApplicationMultipleTargetGroupsEc2Service",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-alb-idle-timeout/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-alb-idle-timeout/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "multiAlbEcsEc2Test": {
- "id": "multiAlbEcsEc2Test",
- "path": "multiAlbEcsEc2Test",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "multiAlbEcsEc2Test/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "multiAlbEcsEc2Test/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "multiAlbEcsEc2Test/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "multiAlbEcsEc2Test/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "multiAlbEcsEc2Test/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ-alb-idle-timeout":{"id":"aws-ecs-integ-alb-idle-timeout","path":"aws-ecs-integ-alb-idle-timeout","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-alb-idle-timeout/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-alb-idle-timeout/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-alb-idle-timeout/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-alb-idle-timeout/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-alb-idle-timeout/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-alb-idle-timeout/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-alb-idle-timeout/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ-alb-idle-timeout/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-alb-idle-timeout/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-alb-idle-timeout/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-alb-idle-timeout/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-alb-idle-timeout/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-alb-idle-timeout/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"HostedZone":{"id":"HostedZone","path":"aws-ecs-integ-alb-idle-timeout/HostedZone","constructInfo":{"fqn":"aws-cdk-lib.aws_route53.PublicHostedZone","version":"0.0.0","metadata":[{"zoneName":"*"},{"zoneName":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/HostedZone/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_route53.CfnHostedZone","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Route53::HostedZone","aws:cdk:cloudformation:props":{"name":"example.com."}}}}},"Cluster":{"id":"Cluster","path":"aws-ecs-integ-alb-idle-timeout/Cluster","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-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true},{"addIngressRule":["*",{},"*",false]},{"addIngressRule":["*",{},"*",false]},{"addIngressRule":["*",{},"*",false]},{"addIngressRule":["*",{},"*",false]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"from awsecsintegalbidletimeoutmyServicelb1SecurityGroup378D68EF:32768-65535":{"id":"from awsecsintegalbidletimeoutmyServicelb1SecurityGroup378D68EF:32768-65535","path":"aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup/from awsecsintegalbidletimeoutmyServicelb1SecurityGroup378D68EF:32768-65535","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroupIngress","aws:cdk:cloudformation:props":{"description":"Load balancer to target","fromPort":32768,"groupId":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A","GroupId"]},"ipProtocol":"tcp","sourceSecurityGroupId":{"Fn::GetAtt":["myServicelb1SecurityGroup342C51EA","GroupId"]},"toPort":65535}}},"from awsecsintegalbidletimeoutmyServicelb2SecurityGroupE659E2B0:32768-65535":{"id":"from awsecsintegalbidletimeoutmyServicelb2SecurityGroupE659E2B0:32768-65535","path":"aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup/from awsecsintegalbidletimeoutmyServicelb2SecurityGroupE659E2B0:32768-65535","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroupIngress","aws:cdk:cloudformation:props":{"description":"Load balancer to target","fromPort":32768,"groupId":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A","GroupId"]},"ipProtocol":"tcp","sourceSecurityGroupId":{"Fn::GetAtt":["myServicelb2SecurityGroupEB00B5B9","GroupId"]},"toPort":65535}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/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":["ClusterEB0386A7","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy06157A81","roles":[{"Ref":"ClusterDefaultAutoScalingGroupInstanceRole9A14B384"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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":"ClusterDefaultAutoScalingGroupInstanceRole9A14B384"}]}}},"LaunchConfig":{"id":"LaunchConfig","path":"aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/LaunchConfig","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.CfnLaunchConfiguration","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::AutoScaling::LaunchConfiguration","aws:cdk:cloudformation:props":{"iamInstanceProfile":{"Ref":"ClusterDefaultAutoScalingGroupInstanceProfile2BB4FE55"},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","securityGroups":[{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A","GroupId"]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"ClusterEB0386A7"}," >> /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"]]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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":{"launchConfigurationName":{"Ref":"ClusterDefaultAutoScalingGroupLaunchConfig81EA5466"},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/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":"ClusterDefaultAutoScalingGroupASG0F98E147"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}],"Version":"2012-10-17"},"policyName":"ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicy221F6E5E","roles":[{"Ref":"ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole2AC250B1"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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":"ClusterEB0386A7"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole2AC250B1","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicB6B50466":{"id":"AllowInvoke:awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicB6B50466","path":"aws-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicB6B50466","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":["ClusterDefaultAutoScalingGroupDrainECSHookFunctionFE918865","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"}}}},"Topic":{"id":"Topic","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/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":["ClusterDefaultAutoScalingGroupDrainECSHookFunctionFE918865","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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-ecs-integ-alb-idle-timeout/Cluster/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":"ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"}}],"Version":"2012-10-17"},"policyName":"ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicyFFFD6EA5","roles":[{"Ref":"ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole70201663"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/Cluster/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":"ClusterDefaultAutoScalingGroupASG0F98E147"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"},"roleArn":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole70201663","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-ecs-integ-alb-idle-timeout/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-ecs-integ-alb-idle-timeout/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":[]}},"Cert":{"id":"Cert","path":"aws-ecs-integ-alb-idle-timeout/Cert","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"Cert2":{"id":"Cert2","path":"aws-ecs-integ-alb-idle-timeout/Cert2","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"myService":{"id":"myService","path":"aws-ecs-integ-alb-idle-timeout/myService","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.ApplicationMultipleTargetGroupsEc2Service","version":"0.0.0"},"children":{"lb1":{"id":"lb1","path":"aws-ecs-integ-alb-idle-timeout/myService/lb1","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationLoadBalancer","version":"0.0.0","metadata":["*","*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/lb1/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnLoadBalancer","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::LoadBalancer","aws:cdk:cloudformation:props":{"loadBalancerAttributes":[{"key":"deletion_protection.enabled","value":"false"},{"key":"idle_timeout.timeout_seconds","value":"5"}],"name":"lb1","scheme":"internet-facing","securityGroups":[{"Fn::GetAtt":["myServicelb1SecurityGroup342C51EA","GroupId"]}],"subnets":[{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},{"Ref":"VpcPublicSubnet2Subnet691E08A3"}],"type":"application"}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-integ-alb-idle-timeout/myService/lb1/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","description":"*","allowAllOutbound":false},{"addIngressRule":[{"canInlineRule":true,"connections":"*","uniqueId":"*"},{},"*",false]},{"addEgressRule":["*",{},"*",true]},{"addEgressRule":["*",{},"*",true]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/lb1/SecurityGroup/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":"Automatically created Security Group for ELB awsecsintegalbidletimeoutmyServicelb1D1305870","securityGroupIngress":[{"cidrIp":"0.0.0.0/0","ipProtocol":"tcp","fromPort":443,"toPort":443,"description":"Allow from anyone on port 443"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"to awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupInstanceSecurityGroup9C8FC9DE:32768-65535":{"id":"to awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupInstanceSecurityGroup9C8FC9DE:32768-65535","path":"aws-ecs-integ-alb-idle-timeout/myService/lb1/SecurityGroup/to awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupInstanceSecurityGroup9C8FC9DE:32768-65535","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroupEgress","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroupEgress","aws:cdk:cloudformation:props":{"description":"Load balancer to target","destinationSecurityGroupId":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A","GroupId"]},"fromPort":32768,"groupId":{"Fn::GetAtt":["myServicelb1SecurityGroup342C51EA","GroupId"]},"ipProtocol":"tcp","toPort":65535}}}}},"listener":{"id":"listener","path":"aws-ecs-integ-alb-idle-timeout/myService/lb1/listener","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListener","version":"0.0.0","metadata":["*","*","*","*","*","*","*","*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/lb1/listener/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnListener","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::Listener","aws:cdk:cloudformation:props":{"certificates":[{"certificateArn":"helloworld"}],"defaultActions":[{"type":"forward","targetGroupArn":{"Ref":"myServicelb1listenerECSTargetGroupweb80Group6EDAD1E5"}}],"loadBalancerArn":{"Ref":"myServicelb1FA8CBE12"},"port":443,"protocol":"HTTPS","sslPolicy":"ELBSecurityPolicy-TLS-1-2-Ext-2018-06"}}},"ECSTargetGroupweb80Group":{"id":"ECSTargetGroupweb80Group","path":"aws-ecs-integ-alb-idle-timeout/myService/lb1/listener/ECSTargetGroupweb80Group","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/lb1/listener/ECSTargetGroupweb80Group/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::TargetGroup","aws:cdk:cloudformation:props":{"port":80,"protocol":"HTTP","targetGroupAttributes":[{"key":"stickiness.enabled","value":"false"}],"targetType":"instance","vpcId":{"Ref":"Vpc8378EB38"}}}}}},"ECSTargetGroupweb90Group":{"id":"ECSTargetGroupweb90Group","path":"aws-ecs-integ-alb-idle-timeout/myService/lb1/listener/ECSTargetGroupweb90Group","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/lb1/listener/ECSTargetGroupweb90Group/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::TargetGroup","aws:cdk:cloudformation:props":{"port":80,"protocol":"HTTP","targetGroupAttributes":[{"key":"stickiness.enabled","value":"false"}],"targetType":"instance","vpcId":{"Ref":"Vpc8378EB38"}}}}}},"ECSTargetGroupweb90Rule":{"id":"ECSTargetGroupweb90Rule","path":"aws-ecs-integ-alb-idle-timeout/myService/lb1/listener/ECSTargetGroupweb90Rule","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListenerRule","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/lb1/listener/ECSTargetGroupweb90Rule/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnListenerRule","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::ListenerRule","aws:cdk:cloudformation:props":{"actions":[{"type":"forward","targetGroupArn":{"Ref":"myServicelb1listenerECSTargetGroupweb90Group392113A5"}}],"conditions":[{"field":"path-pattern","pathPatternConfig":{"values":["a/b/c"]}}],"listenerArn":{"Ref":"myServicelb1listener94ADDDDF"},"priority":10}}}}}}}}},"DNSlb1":{"id":"DNSlb1","path":"aws-ecs-integ-alb-idle-timeout/myService/DNSlb1","constructInfo":{"fqn":"aws-cdk-lib.aws_route53.ARecord","version":"0.0.0","metadata":[{"zone":"*","recordName":"*","target":"*"},{"zone":"*","recordName":"*","target":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/DNSlb1/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_route53.CfnRecordSet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Route53::RecordSet","aws:cdk:cloudformation:props":{"aliasTarget":{"hostedZoneId":{"Fn::GetAtt":["myServicelb1FA8CBE12","CanonicalHostedZoneID"]},"dnsName":{"Fn::Join":["",["dualstack.",{"Fn::GetAtt":["myServicelb1FA8CBE12","DNSName"]}]]}},"hostedZoneId":{"Ref":"HostedZoneDB99F866"},"name":"api.example.com.","type":"A"}}}}},"LoadBalancerDNSlb1":{"id":"LoadBalancerDNSlb1","path":"aws-ecs-integ-alb-idle-timeout/myService/LoadBalancerDNSlb1","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"ServiceURLlb1https":{"id":"ServiceURLlb1https","path":"aws-ecs-integ-alb-idle-timeout/myService/ServiceURLlb1https","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"lb2":{"id":"lb2","path":"aws-ecs-integ-alb-idle-timeout/myService/lb2","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationLoadBalancer","version":"0.0.0","metadata":["*","*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/lb2/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnLoadBalancer","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::LoadBalancer","aws:cdk:cloudformation:props":{"loadBalancerAttributes":[{"key":"deletion_protection.enabled","value":"false"},{"key":"idle_timeout.timeout_seconds","value":"500"}],"name":"lb2","scheme":"internet-facing","securityGroups":[{"Fn::GetAtt":["myServicelb2SecurityGroupEB00B5B9","GroupId"]}],"subnets":[{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},{"Ref":"VpcPublicSubnet2Subnet691E08A3"}],"type":"application"}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-integ-alb-idle-timeout/myService/lb2/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","description":"*","allowAllOutbound":false},{"addIngressRule":[{"canInlineRule":true,"connections":"*","uniqueId":"*"},{},"*",false]},{"addEgressRule":["*",{},"*",true]},{"addEgressRule":["*",{},"*",true]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/lb2/SecurityGroup/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":"Automatically created Security Group for ELB awsecsintegalbidletimeoutmyServicelb227337DD9","securityGroupIngress":[{"cidrIp":"0.0.0.0/0","ipProtocol":"tcp","fromPort":443,"toPort":443,"description":"Allow from anyone on port 443"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"to awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupInstanceSecurityGroup9C8FC9DE:32768-65535":{"id":"to awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupInstanceSecurityGroup9C8FC9DE:32768-65535","path":"aws-ecs-integ-alb-idle-timeout/myService/lb2/SecurityGroup/to awsecsintegalbidletimeoutClusterDefaultAutoScalingGroupInstanceSecurityGroup9C8FC9DE:32768-65535","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroupEgress","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroupEgress","aws:cdk:cloudformation:props":{"description":"Load balancer to target","destinationSecurityGroupId":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A","GroupId"]},"fromPort":32768,"groupId":{"Fn::GetAtt":["myServicelb2SecurityGroupEB00B5B9","GroupId"]},"ipProtocol":"tcp","toPort":65535}}}}},"listener2":{"id":"listener2","path":"aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListener","version":"0.0.0","metadata":["*","*","*","*","*","*","*","*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnListener","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::Listener","aws:cdk:cloudformation:props":{"certificates":[{"certificateArn":"helloworld"}],"defaultActions":[{"type":"forward","targetGroupArn":{"Ref":"myServicelb2listener2ECSTargetGroupweb443Group8FAB1268"}}],"loadBalancerArn":{"Ref":"myServicelb2C84C7BCB"},"port":443,"protocol":"HTTPS","sslPolicy":"ELBSecurityPolicy-TLS-1-2-Ext-2018-06"}}},"ECSTargetGroupweb443Group":{"id":"ECSTargetGroupweb443Group","path":"aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2/ECSTargetGroupweb443Group","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2/ECSTargetGroupweb443Group/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::TargetGroup","aws:cdk:cloudformation:props":{"port":80,"protocol":"HTTP","targetGroupAttributes":[{"key":"stickiness.enabled","value":"false"}],"targetType":"instance","vpcId":{"Ref":"Vpc8378EB38"}}}}}},"ECSTargetGroupweb80Group":{"id":"ECSTargetGroupweb80Group","path":"aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2/ECSTargetGroupweb80Group","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2/ECSTargetGroupweb80Group/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::TargetGroup","aws:cdk:cloudformation:props":{"port":80,"protocol":"HTTP","targetGroupAttributes":[{"key":"stickiness.enabled","value":"false"}],"targetType":"instance","vpcId":{"Ref":"Vpc8378EB38"}}}}}},"ECSTargetGroupweb80Rule":{"id":"ECSTargetGroupweb80Rule","path":"aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2/ECSTargetGroupweb80Rule","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListenerRule","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/lb2/listener2/ECSTargetGroupweb80Rule/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnListenerRule","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::ListenerRule","aws:cdk:cloudformation:props":{"actions":[{"type":"forward","targetGroupArn":{"Ref":"myServicelb2listener2ECSTargetGroupweb80Group0590BDE6"}}],"conditions":[{"field":"path-pattern","pathPatternConfig":{"values":["a/b/c"]}}],"listenerArn":{"Ref":"myServicelb2listener2AA6970EB"},"priority":10}}}}}}}}},"DNSlb2":{"id":"DNSlb2","path":"aws-ecs-integ-alb-idle-timeout/myService/DNSlb2","constructInfo":{"fqn":"aws-cdk-lib.aws_route53.ARecord","version":"0.0.0","metadata":[{"zone":"*","recordName":"*","target":"*"},{"zone":"*","recordName":"*","target":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/DNSlb2/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_route53.CfnRecordSet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Route53::RecordSet","aws:cdk:cloudformation:props":{"aliasTarget":{"hostedZoneId":{"Fn::GetAtt":["myServicelb2C84C7BCB","CanonicalHostedZoneID"]},"dnsName":{"Fn::Join":["",["dualstack.",{"Fn::GetAtt":["myServicelb2C84C7BCB","DNSName"]}]]}},"hostedZoneId":{"Ref":"HostedZoneDB99F866"},"name":"frontend.example.com.","type":"A"}}}}},"LoadBalancerDNSlb2":{"id":"LoadBalancerDNSlb2","path":"aws-ecs-integ-alb-idle-timeout/myService/LoadBalancerDNSlb2","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"ServiceURLlb2https":{"id":"ServiceURLlb2https","path":"aws-ecs-integ-alb-idle-timeout/myService/ServiceURLlb2https","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"TaskDef":{"id":"TaskDef","path":"aws-ecs-integ-alb-idle-timeout/myService/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*","*","*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-alb-idle-timeout/myService/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-alb-idle-timeout/myService/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-alb-idle-timeout/myService/TaskDef/TaskRole/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-ecs-integ-alb-idle-timeout/myService/TaskDef/TaskRole/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":["logs:CreateLogStream","logs:DescribeLogGroups","logs:DescribeLogStreams","logs:PutLogEvents","ssmmessages:CreateControlChannel","ssmmessages:CreateDataChannel","ssmmessages:OpenControlChannel","ssmmessages:OpenDataChannel"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"myServiceTaskDefTaskRoleDefaultPolicyD48473C0","roles":[{"Ref":"myServiceTaskDefTaskRole1C1DE6CC"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/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","portMappings":[{"containerPort":80,"hostPort":0,"protocol":"tcp"},{"containerPort":90,"hostPort":0,"protocol":"tcp"},{"containerPort":443,"hostPort":0,"protocol":"tcp"}],"logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"myServiceTaskDefwebLogGroupA1767F2C"},"awslogs-stream-prefix":"myService","awslogs-region":{"Ref":"AWS::Region"}}}}],"executionRoleArn":{"Fn::GetAtt":["myServiceTaskDefExecutionRole618CD311","Arn"]},"family":"awsecsintegalbidletimeoutmyServiceTaskDef954405E6","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["myServiceTaskDefTaskRole1C1DE6CC","Arn"]}}}},"web":{"id":"web","path":"aws-ecs-integ-alb-idle-timeout/myService/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"LogGroup":{"id":"LogGroup","path":"aws-ecs-integ-alb-idle-timeout/myService/TaskDef/web/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/TaskDef/web/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-ecs-integ-alb-idle-timeout/myService/TaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-integ-alb-idle-timeout/myService/TaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/TaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-alb-idle-timeout/myService/TaskDef/ExecutionRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-alb-idle-timeout/myService/TaskDef/ExecutionRole/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":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["myServiceTaskDefwebLogGroupA1767F2C","Arn"]}}],"Version":"2012-10-17"},"policyName":"myServiceTaskDefExecutionRoleDefaultPolicyBDAEC571","roles":[{"Ref":"myServiceTaskDefExecutionRole618CD311"}]}}}}}}}}},"Service":{"id":"Service","path":"aws-ecs-integ-alb-idle-timeout/myService/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ-alb-idle-timeout/myService/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":"ClusterEB0386A7"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50,"alarms":{"alarmNames":[],"enable":false,"rollback":false}},"enableEcsManagedTags":false,"enableExecuteCommand":true,"healthCheckGracePeriodSeconds":60,"launchType":"EC2","loadBalancers":[{"targetGroupArn":{"Ref":"myServicelb1listenerECSTargetGroupweb80Group6EDAD1E5"},"containerName":"web","containerPort":80},{"targetGroupArn":{"Ref":"myServicelb1listenerECSTargetGroupweb90Group392113A5"},"containerName":"web","containerPort":90},{"targetGroupArn":{"Ref":"myServicelb2listener2ECSTargetGroupweb443Group8FAB1268"},"containerName":"web","containerPort":443},{"targetGroupArn":{"Ref":"myServicelb2listener2ECSTargetGroupweb80Group0590BDE6"},"containerName":"web","containerPort":80}],"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"myServiceTaskDef7FB8322A"}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-alb-idle-timeout/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-alb-idle-timeout/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"multiAlbEcsEc2Test":{"id":"multiAlbEcsEc2Test","path":"multiAlbEcsEc2Test","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"multiAlbEcsEc2Test/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"multiAlbEcsEc2Test/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"multiAlbEcsEc2Test/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"multiAlbEcsEc2Test/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"multiAlbEcsEc2Test/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-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/applicationMultipleTargetGroupsEc2ServiceTestDefaultTestDeployAssert1194B50F.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/applicationMultipleTargetGroupsEc2ServiceTestDefaultTestDeployAssert1194B50F.assets.json
index 85ff67c52fb6a..2e7194de842f7 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/applicationMultipleTargetGroupsEc2ServiceTestDefaultTestDeployAssert1194B50F.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/applicationMultipleTargetGroupsEc2ServiceTestDefaultTestDeployAssert1194B50F.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "applicationMultipleTargetGroupsEc2ServiceTestDefaultTestDeployAssert1194B50F Template",
"source": {
"path": "applicationMultipleTargetGroupsEc2ServiceTestDefaultTestDeployAssert1194B50F.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/aws-ecs-integ-multiple-alb.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/aws-ecs-integ-multiple-alb.assets.json
index 77a6278a9fdaf..dcef85b1a61b3 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/aws-ecs-integ-multiple-alb.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/aws-ecs-integ-multiple-alb.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "4206140067eea68731cbdc100e86cd6361e9d373c36720f4a999e7f7e6a50efe": {
+ "a0581f70362e305305837db2e73e6b647f8f878568cdc16012d3b8932a1eafaf": {
+ "displayName": "aws-ecs-integ-multiple-alb Template",
"source": {
"path": "aws-ecs-integ-multiple-alb.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-b7979a30": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "4206140067eea68731cbdc100e86cd6361e9d373c36720f4a999e7f7e6a50efe.json",
+ "objectKey": "a0581f70362e305305837db2e73e6b647f8f878568cdc16012d3b8932a1eafaf.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/aws-ecs-integ-multiple-alb.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/aws-ecs-integ-multiple-alb.template.json
index 507891aec2498..8b8bc9350aad1 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/aws-ecs-integ-multiple-alb.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/aws-ecs-integ-multiple-alb.template.json
@@ -776,7 +776,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -792,7 +792,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/integ.json
index bc04a8be4aa03..d3312e236730b 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"applicationMultipleTargetGroupsEc2ServiceTest/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "applicationMultipleTargetGroupsEc2ServiceTest/DefaultTest/DeployAssert",
"assertionStackName": "applicationMultipleTargetGroupsEc2ServiceTestDefaultTestDeployAssert1194B50F"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/manifest.json
index 1e22148e87a4c..0b2802a26370a 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ-multiple-alb.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/4206140067eea68731cbdc100e86cd6361e9d373c36720f4a999e7f7e6a50efe.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/a0581f70362e305305837db2e73e6b647f8f878568cdc16012d3b8932a1eafaf.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1263,51 +1263,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole02E489EC0": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole02E489EC0",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole13AF1063A": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole13AF1063A",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole2D53500AD": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole2D53500AD",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole386EBB933": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole386EBB933",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4F316D036": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4F316D036",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ-multiple-alb"
@@ -1365,6 +1320,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/tree.json
index a88fd98fd0ffd..d1a7dbea0ab3f 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.multiple-application-load-balanced-ecs-service.js.snapshot/tree.json
@@ -1,2650 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ-multiple-alb": {
- "id": "aws-ecs-integ-multiple-alb",
- "path": "aws-ecs-integ-multiple-alb",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ-multiple-alb/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/Vpc/Resource",
- "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-ecs-integ-multiple-alb/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ-multiple-alb/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ-multiple-alb/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-multiple-alb/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ-multiple-alb/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ-multiple-alb/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ-multiple-alb/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-multiple-alb/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ-multiple-alb/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "Cluster": {
- "id": "Cluster",
- "path": "aws-ecs-integ-multiple-alb/Cluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/Cluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- },
- "from awsecsintegmultiplealbmyServiceLBSecurityGroupA7380E25:32768-65535": {
- "id": "from awsecsintegmultiplealbmyServiceLBSecurityGroupA7380E25:32768-65535",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup/from awsecsintegmultiplealbmyServiceLBSecurityGroupA7380E25:32768-65535",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupIngress",
- "aws:cdk:cloudformation:props": {
- "description": "Load balancer to target",
- "fromPort": 32768,
- "groupId": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A",
- "GroupId"
- ]
- },
- "ipProtocol": "tcp",
- "sourceSecurityGroupId": {
- "Fn::GetAtt": [
- "myServiceLBSecurityGroupFE0ED608",
- "GroupId"
- ]
- },
- "toPort": 65535
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- },
- {
- "addIngressRule": [
- "*",
- {},
- "*",
- false
- ]
- },
- {
- "addIngressRule": [
- "*",
- {},
- "*",
- false
- ]
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- },
- {
- "Action": [
- "ecs:Poll",
- "ecs:StartTelemetrySession"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecr:GetAuthorizationToken",
- "ecs:DiscoverPollEndpoint",
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy06157A81",
- "roles": [
- {
- "Ref": "ClusterDefaultAutoScalingGroupInstanceRole9A14B384"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "ClusterDefaultAutoScalingGroupInstanceRole9A14B384"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupInstanceProfile2BB4FE55",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "t2.micro",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "#!/bin/bash\necho ECS_CLUSTER=",
- {
- "Ref": "ClusterEB0386A7"
- },
- " >> /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-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "ClusterDefaultAutoScalingGroupLaunchTemplate2449908D"
- },
- "version": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupLaunchTemplate2449908D",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "1",
- "minSize": "1",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "ClusterDefaultAutoScalingGroupASG0F98E147"
- }
- ]
- ]
- }
- },
- {
- "Action": [
- "ecs:DescribeContainerInstances",
- "ecs:DescribeTasks",
- "ecs:ListTasks",
- "ecs:UpdateContainerInstancesState"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecs:ListContainerInstances",
- "ecs:SubmitContainerStateChange",
- "ecs:SubmitTaskStateChange"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicy221F6E5E",
- "roles": [
- {
- "Ref": "ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole2AC250B1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": "ClusterEB0386A7"
- }
- }
- },
- "handler": "index.lambda_handler",
- "role": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole2AC250B1",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegmultiplealbClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic69A3F5ED": {
- "id": "AllowInvoke:awsecsintegmultiplealbClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic69A3F5ED",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegmultiplealbClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic69A3F5ED",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctionFE918865",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupDrainECSHookFunctionFE918865",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicyFFFD6EA5",
- "roles": [
- {
- "Ref": "ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole70201663"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "ClusterDefaultAutoScalingGroupASG0F98E147"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole70201663",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ-multiple-alb/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ-multiple-alb/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-multiple-alb/TaskDef/TaskRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/TaskDef/TaskRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:DescribeLogGroups",
- "logs:DescribeLogStreams",
- "logs:PutLogEvents",
- "ssmmessages:CreateControlChannel",
- "ssmmessages:CreateDataChannel",
- "ssmmessages:OpenControlChannel",
- "ssmmessages:OpenDataChannel"
- ],
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "TaskDefTaskRoleDefaultPolicyA592CB18",
- "roles": [
- {
- "Ref": "TaskDefTaskRole1EDB4A67"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "command": [
- "sh",
- "-c",
- "printf 'Listen 90\n \n DocumentRoot /var/www/html\n ServerName localhost\n' > /etc/httpd/conf.d/default-90.conf && /usr/sbin/apache2 -D FOREGROUND"
- ],
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "memory": 256,
- "name": "web",
- "portMappings": [
- {
- "containerPort": 80,
- "hostPort": 0,
- "protocol": "tcp"
- },
- {
- "containerPort": 90,
- "hostPort": 0,
- "protocol": "tcp"
- }
- ]
- }
- ],
- "family": "awsecsintegmultiplealbTaskDef053E81DE",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "web": {
- "id": "web",
- "path": "aws-ecs-integ-multiple-alb/TaskDef/web",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*"
- ]
- }
- },
- "myService": {
- "id": "myService",
- "path": "aws-ecs-integ-multiple-alb/myService",
- "children": {
- "LB": {
- "id": "LB",
- "path": "aws-ecs-integ-multiple-alb/myService/LB",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/myService/LB/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
- "aws:cdk:cloudformation:props": {
- "loadBalancerAttributes": [
- {
- "key": "deletion_protection.enabled",
- "value": "false"
- }
- ],
- "name": "LB",
- "scheme": "internet-facing",
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "myServiceLBSecurityGroupFE0ED608",
- "GroupId"
- ]
- }
- ],
- "subnets": [
- {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- ],
- "type": "application"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnLoadBalancer",
- "version": "0.0.0"
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-integ-multiple-alb/myService/LB/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/myService/LB/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "Automatically created Security Group for ELB awsecsintegmultiplealbmyServiceLB809BE588",
- "securityGroupIngress": [
- {
- "cidrIp": "0.0.0.0/0",
- "ipProtocol": "tcp",
- "fromPort": 80,
- "toPort": 80,
- "description": "Allow from anyone on port 80"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- },
- "to awsecsintegmultiplealbClusterDefaultAutoScalingGroupInstanceSecurityGroup9E5900FD:32768-65535": {
- "id": "to awsecsintegmultiplealbClusterDefaultAutoScalingGroupInstanceSecurityGroup9E5900FD:32768-65535",
- "path": "aws-ecs-integ-multiple-alb/myService/LB/SecurityGroup/to awsecsintegmultiplealbClusterDefaultAutoScalingGroupInstanceSecurityGroup9E5900FD:32768-65535",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupEgress",
- "aws:cdk:cloudformation:props": {
- "description": "Load balancer to target",
- "destinationSecurityGroupId": {
- "Fn::GetAtt": [
- "ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A",
- "GroupId"
- ]
- },
- "fromPort": 32768,
- "groupId": {
- "Fn::GetAtt": [
- "myServiceLBSecurityGroupFE0ED608",
- "GroupId"
- ]
- },
- "ipProtocol": "tcp",
- "toPort": 65535
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupEgress",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "description": "*",
- "allowAllOutbound": false
- },
- {
- "addIngressRule": [
- {
- "canInlineRule": true,
- "connections": "*",
- "uniqueId": "*"
- },
- {},
- "*",
- false
- ]
- },
- {
- "addEgressRule": [
- "*",
- {},
- "*",
- true
- ]
- },
- {
- "addEgressRule": [
- "*",
- {},
- "*",
- true
- ]
- }
- ]
- }
- },
- "PublicListener": {
- "id": "PublicListener",
- "path": "aws-ecs-integ-multiple-alb/myService/LB/PublicListener",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/myService/LB/PublicListener/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::Listener",
- "aws:cdk:cloudformation:props": {
- "defaultActions": [
- {
- "type": "forward",
- "targetGroupArn": {
- "Ref": "myServiceLBPublicListenerECSTargetGroupweb80GroupCA306BD0"
- }
- }
- ],
- "loadBalancerArn": {
- "Ref": "myServiceLB168895E1"
- },
- "port": 80,
- "protocol": "HTTP"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnListener",
- "version": "0.0.0"
- }
- },
- "ECSTargetGroupweb80Group": {
- "id": "ECSTargetGroupweb80Group",
- "path": "aws-ecs-integ-multiple-alb/myService/LB/PublicListener/ECSTargetGroupweb80Group",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/myService/LB/PublicListener/ECSTargetGroupweb80Group/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::TargetGroup",
- "aws:cdk:cloudformation:props": {
- "port": 80,
- "protocol": "HTTP",
- "targetGroupAttributes": [
- {
- "key": "stickiness.enabled",
- "value": "false"
- }
- ],
- "targetType": "instance",
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup",
- "version": "0.0.0"
- }
- },
- "ECSTargetGroupweb90Group": {
- "id": "ECSTargetGroupweb90Group",
- "path": "aws-ecs-integ-multiple-alb/myService/LB/PublicListener/ECSTargetGroupweb90Group",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/myService/LB/PublicListener/ECSTargetGroupweb90Group/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::TargetGroup",
- "aws:cdk:cloudformation:props": {
- "port": 80,
- "protocol": "HTTP",
- "targetGroupAttributes": [
- {
- "key": "stickiness.enabled",
- "value": "false"
- }
- ],
- "targetType": "instance",
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup",
- "version": "0.0.0"
- }
- },
- "ECSTargetGroupweb90Rule": {
- "id": "ECSTargetGroupweb90Rule",
- "path": "aws-ecs-integ-multiple-alb/myService/LB/PublicListener/ECSTargetGroupweb90Rule",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-multiple-alb/myService/LB/PublicListener/ECSTargetGroupweb90Rule/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::ListenerRule",
- "aws:cdk:cloudformation:props": {
- "actions": [
- {
- "type": "forward",
- "targetGroupArn": {
- "Ref": "myServiceLBPublicListenerECSTargetGroupweb90Group6388E5B5"
- }
- }
- ],
- "conditions": [
- {
- "field": "path-pattern",
- "pathPatternConfig": {
- "values": [
- "a/b/c"
- ]
- }
- }
- ],
- "listenerArn": {
- "Ref": "myServiceLBPublicListenerC78AE8A0"
- },
- "priority": 10
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnListenerRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListenerRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListener",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationLoadBalancer",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "LoadBalancerDNS": {
- "id": "LoadBalancerDNS",
- "path": "aws-ecs-integ-multiple-alb/myService/LoadBalancerDNS",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "ServiceURL": {
- "id": "ServiceURL",
- "path": "aws-ecs-integ-multiple-alb/myService/ServiceURL",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-multiple-alb/myService/Service",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-multiple-alb/myService/Service/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "ClusterEB0386A7"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "enableExecuteCommand": true,
- "healthCheckGracePeriodSeconds": 60,
- "launchType": "EC2",
- "loadBalancers": [
- {
- "targetGroupArn": {
- "Ref": "myServiceLBPublicListenerECSTargetGroupweb80GroupCA306BD0"
- },
- "containerName": "web",
- "containerPort": 80
- },
- {
- "targetGroupArn": {
- "Ref": "myServiceLBPublicListenerECSTargetGroupweb90Group6388E5B5"
- },
- "containerName": "web",
- "containerPort": 90
- }
- ],
- "schedulingStrategy": "REPLICA",
- "taskDefinition": {
- "Ref": "TaskDef54694570"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs_patterns.ApplicationMultipleTargetGroupsEc2Service",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-multiple-alb/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-multiple-alb/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "applicationMultipleTargetGroupsEc2ServiceTest": {
- "id": "applicationMultipleTargetGroupsEc2ServiceTest",
- "path": "applicationMultipleTargetGroupsEc2ServiceTest",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "applicationMultipleTargetGroupsEc2ServiceTest/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "applicationMultipleTargetGroupsEc2ServiceTest/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "applicationMultipleTargetGroupsEc2ServiceTest/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "applicationMultipleTargetGroupsEc2ServiceTest/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "applicationMultipleTargetGroupsEc2ServiceTest/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ-multiple-alb":{"id":"aws-ecs-integ-multiple-alb","path":"aws-ecs-integ-multiple-alb","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-multiple-alb/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-multiple-alb/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-multiple-alb/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-multiple-alb/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-multiple-alb/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-multiple-alb/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-multiple-alb/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-multiple-alb/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-multiple-alb/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-multiple-alb/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ-multiple-alb/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-multiple-alb/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-multiple-alb/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-multiple-alb/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-multiple-alb/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-multiple-alb/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-multiple-alb/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"Cluster":{"id":"Cluster","path":"aws-ecs-integ-multiple-alb/Cluster","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-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true},{"addIngressRule":["*",{},"*",false]},{"addIngressRule":["*",{},"*",false]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"from awsecsintegmultiplealbmyServiceLBSecurityGroupA7380E25:32768-65535":{"id":"from awsecsintegmultiplealbmyServiceLBSecurityGroupA7380E25:32768-65535","path":"aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup/from awsecsintegmultiplealbmyServiceLBSecurityGroupA7380E25:32768-65535","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroupIngress","aws:cdk:cloudformation:props":{"description":"Load balancer to target","fromPort":32768,"groupId":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A","GroupId"]},"ipProtocol":"tcp","sourceSecurityGroupId":{"Fn::GetAtt":["myServiceLBSecurityGroupFE0ED608","GroupId"]},"toPort":65535}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/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":["ClusterEB0386A7","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy06157A81","roles":[{"Ref":"ClusterDefaultAutoScalingGroupInstanceRole9A14B384"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-ecs-integ-multiple-alb/Cluster/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":"ClusterDefaultAutoScalingGroupInstanceRole9A14B384"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/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":["ClusterDefaultAutoScalingGroupInstanceProfile2BB4FE55","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"ClusterEB0386A7"}," >> /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-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-multiple-alb/Cluster/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":"ClusterDefaultAutoScalingGroupLaunchTemplate2449908D"},"version":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupLaunchTemplate2449908D","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/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":"ClusterDefaultAutoScalingGroupASG0F98E147"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}],"Version":"2012-10-17"},"policyName":"ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicy221F6E5E","roles":[{"Ref":"ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole2AC250B1"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/Cluster/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":"ClusterEB0386A7"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole2AC250B1","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegmultiplealbClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic69A3F5ED":{"id":"AllowInvoke:awsecsintegmultiplealbClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic69A3F5ED","path":"aws-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegmultiplealbClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic69A3F5ED","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":["ClusterDefaultAutoScalingGroupDrainECSHookFunctionFE918865","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"}}}},"Topic":{"id":"Topic","path":"aws-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/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":["ClusterDefaultAutoScalingGroupDrainECSHookFunctionFE918865","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-multiple-alb/Cluster/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-ecs-integ-multiple-alb/Cluster/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":"ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"}}],"Version":"2012-10-17"},"policyName":"ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicyFFFD6EA5","roles":[{"Ref":"ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole70201663"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/Cluster/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":"ClusterDefaultAutoScalingGroupASG0F98E147"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicFE5437FB"},"roleArn":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole70201663","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-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/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-ecs-integ-multiple-alb/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-multiple-alb/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-multiple-alb/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-multiple-alb/TaskDef/TaskRole/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-ecs-integ-multiple-alb/TaskDef/TaskRole/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":["logs:CreateLogStream","logs:DescribeLogGroups","logs:DescribeLogStreams","logs:PutLogEvents","ssmmessages:CreateControlChannel","ssmmessages:CreateDataChannel","ssmmessages:OpenControlChannel","ssmmessages:OpenDataChannel"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"TaskDefTaskRoleDefaultPolicyA592CB18","roles":[{"Ref":"TaskDefTaskRole1EDB4A67"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/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":[{"command":["sh","-c","printf 'Listen 90\n \n DocumentRoot /var/www/html\n ServerName localhost\n' > /etc/httpd/conf.d/default-90.conf && /usr/sbin/apache2 -D FOREGROUND"],"essential":true,"image":"amazon/amazon-ecs-sample","memory":256,"name":"web","portMappings":[{"containerPort":80,"hostPort":0,"protocol":"tcp"},{"containerPort":90,"hostPort":0,"protocol":"tcp"}]}],"family":"awsecsintegmultiplealbTaskDef053E81DE","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"aws-ecs-integ-multiple-alb/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"myService":{"id":"myService","path":"aws-ecs-integ-multiple-alb/myService","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.ApplicationMultipleTargetGroupsEc2Service","version":"0.0.0"},"children":{"LB":{"id":"LB","path":"aws-ecs-integ-multiple-alb/myService/LB","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationLoadBalancer","version":"0.0.0","metadata":["*","*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/myService/LB/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnLoadBalancer","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::LoadBalancer","aws:cdk:cloudformation:props":{"loadBalancerAttributes":[{"key":"deletion_protection.enabled","value":"false"}],"name":"LB","scheme":"internet-facing","securityGroups":[{"Fn::GetAtt":["myServiceLBSecurityGroupFE0ED608","GroupId"]}],"subnets":[{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},{"Ref":"VpcPublicSubnet2Subnet691E08A3"}],"type":"application"}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-integ-multiple-alb/myService/LB/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","description":"*","allowAllOutbound":false},{"addIngressRule":[{"canInlineRule":true,"connections":"*","uniqueId":"*"},{},"*",false]},{"addEgressRule":["*",{},"*",true]},{"addEgressRule":["*",{},"*",true]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/myService/LB/SecurityGroup/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":"Automatically created Security Group for ELB awsecsintegmultiplealbmyServiceLB809BE588","securityGroupIngress":[{"cidrIp":"0.0.0.0/0","ipProtocol":"tcp","fromPort":80,"toPort":80,"description":"Allow from anyone on port 80"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"to awsecsintegmultiplealbClusterDefaultAutoScalingGroupInstanceSecurityGroup9E5900FD:32768-65535":{"id":"to awsecsintegmultiplealbClusterDefaultAutoScalingGroupInstanceSecurityGroup9E5900FD:32768-65535","path":"aws-ecs-integ-multiple-alb/myService/LB/SecurityGroup/to awsecsintegmultiplealbClusterDefaultAutoScalingGroupInstanceSecurityGroup9E5900FD:32768-65535","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroupEgress","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroupEgress","aws:cdk:cloudformation:props":{"description":"Load balancer to target","destinationSecurityGroupId":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupInstanceSecurityGroup1D15236A","GroupId"]},"fromPort":32768,"groupId":{"Fn::GetAtt":["myServiceLBSecurityGroupFE0ED608","GroupId"]},"ipProtocol":"tcp","toPort":65535}}}}},"PublicListener":{"id":"PublicListener","path":"aws-ecs-integ-multiple-alb/myService/LB/PublicListener","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListener","version":"0.0.0","metadata":["*","*","*","*","*","*","*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/myService/LB/PublicListener/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnListener","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::Listener","aws:cdk:cloudformation:props":{"defaultActions":[{"type":"forward","targetGroupArn":{"Ref":"myServiceLBPublicListenerECSTargetGroupweb80GroupCA306BD0"}}],"loadBalancerArn":{"Ref":"myServiceLB168895E1"},"port":80,"protocol":"HTTP"}}},"ECSTargetGroupweb80Group":{"id":"ECSTargetGroupweb80Group","path":"aws-ecs-integ-multiple-alb/myService/LB/PublicListener/ECSTargetGroupweb80Group","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/myService/LB/PublicListener/ECSTargetGroupweb80Group/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::TargetGroup","aws:cdk:cloudformation:props":{"port":80,"protocol":"HTTP","targetGroupAttributes":[{"key":"stickiness.enabled","value":"false"}],"targetType":"instance","vpcId":{"Ref":"Vpc8378EB38"}}}}}},"ECSTargetGroupweb90Group":{"id":"ECSTargetGroupweb90Group","path":"aws-ecs-integ-multiple-alb/myService/LB/PublicListener/ECSTargetGroupweb90Group","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/myService/LB/PublicListener/ECSTargetGroupweb90Group/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::TargetGroup","aws:cdk:cloudformation:props":{"port":80,"protocol":"HTTP","targetGroupAttributes":[{"key":"stickiness.enabled","value":"false"}],"targetType":"instance","vpcId":{"Ref":"Vpc8378EB38"}}}}}},"ECSTargetGroupweb90Rule":{"id":"ECSTargetGroupweb90Rule","path":"aws-ecs-integ-multiple-alb/myService/LB/PublicListener/ECSTargetGroupweb90Rule","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListenerRule","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-multiple-alb/myService/LB/PublicListener/ECSTargetGroupweb90Rule/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnListenerRule","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::ListenerRule","aws:cdk:cloudformation:props":{"actions":[{"type":"forward","targetGroupArn":{"Ref":"myServiceLBPublicListenerECSTargetGroupweb90Group6388E5B5"}}],"conditions":[{"field":"path-pattern","pathPatternConfig":{"values":["a/b/c"]}}],"listenerArn":{"Ref":"myServiceLBPublicListenerC78AE8A0"},"priority":10}}}}}}}}},"LoadBalancerDNS":{"id":"LoadBalancerDNS","path":"aws-ecs-integ-multiple-alb/myService/LoadBalancerDNS","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"ServiceURL":{"id":"ServiceURL","path":"aws-ecs-integ-multiple-alb/myService/ServiceURL","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"Service":{"id":"Service","path":"aws-ecs-integ-multiple-alb/myService/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ-multiple-alb/myService/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":"ClusterEB0386A7"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"enableExecuteCommand":true,"healthCheckGracePeriodSeconds":60,"launchType":"EC2","loadBalancers":[{"targetGroupArn":{"Ref":"myServiceLBPublicListenerECSTargetGroupweb80GroupCA306BD0"},"containerName":"web","containerPort":80},{"targetGroupArn":{"Ref":"myServiceLBPublicListenerECSTargetGroupweb90Group6388E5B5"},"containerName":"web","containerPort":90}],"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-multiple-alb/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-multiple-alb/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"applicationMultipleTargetGroupsEc2ServiceTest":{"id":"applicationMultipleTargetGroupsEc2ServiceTest","path":"applicationMultipleTargetGroupsEc2ServiceTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"applicationMultipleTargetGroupsEc2ServiceTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"applicationMultipleTargetGroupsEc2ServiceTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"applicationMultipleTargetGroupsEc2ServiceTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"applicationMultipleTargetGroupsEc2ServiceTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"applicationMultipleTargetGroupsEc2ServiceTest/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-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/aws-ecs-integ-ecs.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/aws-ecs-integ-ecs.assets.json
index 8f156f94f1825..235b512bf5bcb 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/aws-ecs-integ-ecs.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/aws-ecs-integ-ecs.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "879d43bd7fa593d0da48ddd22d54a1ec2eab5a43a0ec95fb9933166ec27ea119": {
+ "5b039edac4f5ee18e80fc154c3cdb17ff8f41c8caef3cc0faf9df8a681a98e06": {
+ "displayName": "aws-ecs-integ-ecs Template",
"source": {
"path": "aws-ecs-integ-ecs.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-56b91024": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "879d43bd7fa593d0da48ddd22d54a1ec2eab5a43a0ec95fb9933166ec27ea119.json",
+ "objectKey": "5b039edac4f5ee18e80fc154c3cdb17ff8f41c8caef3cc0faf9df8a681a98e06.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/aws-ecs-integ-ecs.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/aws-ecs-integ-ecs.template.json
index 54326dd6e447f..0d9ae68c47492 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/aws-ecs-integ-ecs.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/aws-ecs-integ-ecs.template.json
@@ -575,7 +575,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -591,7 +591,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/integ.json
index 29c7103513726..64d0613a89205 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"scheduledEc2TaskTest/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "scheduledEc2TaskTest/DefaultTest/DeployAssert",
"assertionStackName": "scheduledEc2TaskTestDefaultTestDeployAssertF02313CA"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/manifest.json
index 3d0a95c0da18a..66704fcfd0845 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ-ecs.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/879d43bd7fa593d0da48ddd22d54a1ec2eab5a43a0ec95fb9933166ec27ea119.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/5b039edac4f5ee18e80fc154c3cdb17ff8f41c8caef3cc0faf9df8a681a98e06.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1381,51 +1381,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ-ecs"
@@ -1483,6 +1438,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/scheduledEc2TaskTestDefaultTestDeployAssertF02313CA.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/scheduledEc2TaskTestDefaultTestDeployAssertF02313CA.assets.json
index 62b1786c05ef8..f63fff663398f 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/scheduledEc2TaskTestDefaultTestDeployAssertF02313CA.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/scheduledEc2TaskTestDefaultTestDeployAssertF02313CA.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "scheduledEc2TaskTestDefaultTestDeployAssertF02313CA Template",
"source": {
"path": "scheduledEc2TaskTestDefaultTestDeployAssertF02313CA.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/tree.json
index cac3e492ddf69..a31a43ce36891 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.js.snapshot/tree.json
@@ -1,2793 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ-ecs": {
- "id": "aws-ecs-integ-ecs",
- "path": "aws-ecs-integ-ecs",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ-ecs/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/Vpc/Resource",
- "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-ecs-integ-ecs/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 0,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.0.0/17",
- "mapPublicIpOnLaunch": true,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "Public"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Public"
- },
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 0,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.128.0/17",
- "mapPublicIpOnLaunch": false,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "Private"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Private"
- },
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ-ecs/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ-ecs/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ-ecs/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/ASG",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF": {
- "id": "AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "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"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ-ecs/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-ecs-integ-ecs/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": []
- }
- },
- "ScheduledEc2Task": {
- "id": "ScheduledEc2Task",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task",
- "children": {
- "ScheduledEventRule": {
- "id": "ScheduledEventRule",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledEventRule",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledEventRule/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Events::Rule",
- "aws:cdk:cloudformation:props": {
- "scheduleExpression": "rate(1 minute)",
- "state": "ENABLED",
- "targets": [
- {
- "id": "Target0",
- "arn": {
- "Fn::GetAtt": [
- "EcsCluster97242B84",
- "Arn"
- ]
- },
- "roleArn": {
- "Fn::GetAtt": [
- "ScheduledEc2TaskScheduledTaskDefEventsRole64113C5F",
- "Arn"
- ]
- },
- "ecsParameters": {
- "taskCount": 2,
- "taskDefinitionArn": {
- "Ref": "ScheduledEc2TaskScheduledTaskDef56328BA4"
- },
- "propagateTags": "TASK_DEFINITION",
- "tagList": [
- {
- "key": "my-tag",
- "value": "my-tag-value"
- }
- ]
- },
- "input": "{}"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_events.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_events.Rule",
- "version": "0.0.0",
- "metadata": [
- {
- "schedule": "*",
- "ruleName": "*",
- "enabled": "*"
- },
- {
- "addEventPattern": [
- "*"
- ]
- },
- {
- "addTarget": [
- {}
- ]
- }
- ]
- }
- },
- "ScheduledTaskDef": {
- "id": "ScheduledTaskDef",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "cpu": 1,
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "memory": 512,
- "name": "ScheduledContainer",
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": {
- "Ref": "ScheduledEc2TaskScheduledTaskDefScheduledContainerLogGroupA85E11E6"
- },
- "awslogs-stream-prefix": "ScheduledEc2Task",
- "awslogs-region": {
- "Ref": "AWS::Region"
- }
- }
- },
- "environment": [
- {
- "name": "TRIGGER",
- "value": "CloudWatch Events"
- }
- ]
- }
- ],
- "executionRoleArn": {
- "Fn::GetAtt": [
- "ScheduledEc2TaskScheduledTaskDefExecutionRole65A8CC6F",
- "Arn"
- ]
- },
- "family": "awsecsintegecsScheduledEc2TaskScheduledTaskDef18FB4348",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "ScheduledEc2TaskScheduledTaskDefTaskRoleC3FA127C",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "ScheduledContainer": {
- "id": "ScheduledContainer",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ScheduledContainer",
- "children": {
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ScheduledContainer/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ScheduledContainer/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "retention": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "ScheduledEc2TaskScheduledTaskDefScheduledContainerLogGroupA85E11E6",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ScheduledEc2TaskScheduledTaskDefExecutionRoleDefaultPolicy6E8BCBB0",
- "roles": [
- {
- "Ref": "ScheduledEc2TaskScheduledTaskDefExecutionRole65A8CC6F"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- },
- "roleName": "*"
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "EventsRole": {
- "id": "EventsRole",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/EventsRole",
- "children": {
- "ImportEventsRole": {
- "id": "ImportEventsRole",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/EventsRole/ImportEventsRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/EventsRole/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Role",
- "aws:cdk:cloudformation:props": {
- "assumeRolePolicyDocument": {
- "Statement": [
- {
- "Action": "sts:AssumeRole",
- "Effect": "Allow",
- "Principal": {
- "Service": "events.amazonaws.com"
- }
- }
- ],
- "Version": "2012-10-17"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/EventsRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/EventsRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "ecs:RunTask",
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "EcsCluster97242B84",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": {
- "Ref": "ScheduledEc2TaskScheduledTaskDef56328BA4"
- }
- },
- {
- "Action": "ecs:TagResource",
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecs:",
- {
- "Ref": "AWS::Region"
- },
- ":*:task/",
- {
- "Ref": "EcsCluster97242B84"
- },
- "/*"
- ]
- ]
- }
- },
- {
- "Action": "iam:PassRole",
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "ScheduledEc2TaskScheduledTaskDefExecutionRole65A8CC6F",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ScheduledEc2TaskScheduledTaskDefEventsRoleDefaultPolicyA6C9177A",
- "roles": [
- {
- "Ref": "ScheduledEc2TaskScheduledTaskDefEventsRole64113C5F"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs_patterns.ScheduledEc2Task",
- "version": "0.0.0"
- }
- },
- "ScheduledEc2Task2": {
- "id": "ScheduledEc2Task2",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2",
- "children": {
- "ScheduledEventRule": {
- "id": "ScheduledEventRule",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledEventRule",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledEventRule/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Events::Rule",
- "aws:cdk:cloudformation:props": {
- "scheduleExpression": "rate(1 minute)",
- "state": "ENABLED",
- "targets": [
- {
- "id": "Target0",
- "arn": {
- "Fn::GetAtt": [
- "EcsCluster97242B84",
- "Arn"
- ]
- },
- "roleArn": {
- "Fn::GetAtt": [
- "ScheduledEc2Task2ScheduledTaskDefEventsRoleE4A47A7F",
- "Arn"
- ]
- },
- "ecsParameters": {
- "taskCount": 2,
- "taskDefinitionArn": {
- "Ref": "ScheduledEc2Task2ScheduledTaskDef5A1A589E"
- },
- "propagateTags": "TASK_DEFINITION",
- "tagList": [
- {
- "key": "my-tag",
- "value": "my-tag-value"
- }
- ]
- },
- "input": "{}"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_events.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_events.Rule",
- "version": "0.0.0",
- "metadata": [
- {
- "schedule": "*",
- "ruleName": "*",
- "enabled": "*"
- },
- {
- "addEventPattern": [
- "*"
- ]
- },
- {
- "addTarget": [
- {}
- ]
- }
- ]
- }
- },
- "ScheduledTaskDef": {
- "id": "ScheduledTaskDef",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "cpu": 1,
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "memory": 512,
- "name": "differentName",
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": {
- "Ref": "ScheduledEc2Task2ScheduledTaskDefdifferentNameLogGroup576E34BD"
- },
- "awslogs-stream-prefix": "ScheduledEc2Task2",
- "awslogs-region": {
- "Ref": "AWS::Region"
- }
- }
- },
- "environment": [
- {
- "name": "TRIGGER",
- "value": "CloudWatch Events"
- }
- ]
- }
- ],
- "executionRoleArn": {
- "Fn::GetAtt": [
- "ScheduledEc2Task2ScheduledTaskDefExecutionRoleC4A2CB80",
- "Arn"
- ]
- },
- "family": "awsecsintegecsScheduledEc2Task2ScheduledTaskDef4390684D",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "ScheduledEc2Task2ScheduledTaskDefTaskRoleF24CD72E",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "differentName": {
- "id": "differentName",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/differentName",
- "children": {
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/differentName/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/differentName/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "retention": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "ScheduledEc2Task2ScheduledTaskDefdifferentNameLogGroup576E34BD",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ScheduledEc2Task2ScheduledTaskDefExecutionRoleDefaultPolicy70781945",
- "roles": [
- {
- "Ref": "ScheduledEc2Task2ScheduledTaskDefExecutionRoleC4A2CB80"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- },
- "roleName": "*"
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "EventsRole": {
- "id": "EventsRole",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/EventsRole",
- "children": {
- "ImportEventsRole": {
- "id": "ImportEventsRole",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/EventsRole/ImportEventsRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/EventsRole/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Role",
- "aws:cdk:cloudformation:props": {
- "assumeRolePolicyDocument": {
- "Statement": [
- {
- "Action": "sts:AssumeRole",
- "Effect": "Allow",
- "Principal": {
- "Service": "events.amazonaws.com"
- }
- }
- ],
- "Version": "2012-10-17"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/EventsRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/EventsRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "ecs:RunTask",
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "EcsCluster97242B84",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": {
- "Ref": "ScheduledEc2Task2ScheduledTaskDef5A1A589E"
- }
- },
- {
- "Action": "ecs:TagResource",
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecs:",
- {
- "Ref": "AWS::Region"
- },
- ":*:task/",
- {
- "Ref": "EcsCluster97242B84"
- },
- "/*"
- ]
- ]
- }
- },
- {
- "Action": "iam:PassRole",
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "ScheduledEc2Task2ScheduledTaskDefExecutionRoleC4A2CB80",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ScheduledEc2Task2ScheduledTaskDefEventsRoleDefaultPolicyF5EB7640",
- "roles": [
- {
- "Ref": "ScheduledEc2Task2ScheduledTaskDefEventsRoleE4A47A7F"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs_patterns.ScheduledEc2Task",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-ecs/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-ecs/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "scheduledEc2TaskTest": {
- "id": "scheduledEc2TaskTest",
- "path": "scheduledEc2TaskTest",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "scheduledEc2TaskTest/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "scheduledEc2TaskTest/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "scheduledEc2TaskTest/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "scheduledEc2TaskTest/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "scheduledEc2TaskTest/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ-ecs":{"id":"aws-ecs-integ-ecs","path":"aws-ecs-integ-ecs","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-ecs/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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/17","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"aws-ecs-integ-ecs/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-ecs/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-ecs/Vpc/PublicSubnet1"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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/17","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"aws-ecs-integ-ecs/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-ecs/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF":{"id":"AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF","path":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF","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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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":[]}},"ScheduledEc2Task":{"id":"ScheduledEc2Task","path":"aws-ecs-integ-ecs/ScheduledEc2Task","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.ScheduledEc2Task","version":"0.0.0"},"children":{"ScheduledEventRule":{"id":"ScheduledEventRule","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledEventRule","constructInfo":{"fqn":"aws-cdk-lib.aws_events.Rule","version":"0.0.0","metadata":[{"schedule":"*","ruleName":"*","enabled":"*"},{"addEventPattern":["*"]},{"addTarget":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledEventRule/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_events.CfnRule","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Events::Rule","aws:cdk:cloudformation:props":{"scheduleExpression":"rate(1 minute)","state":"ENABLED","targets":[{"id":"Target0","arn":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]},"roleArn":{"Fn::GetAtt":["ScheduledEc2TaskScheduledTaskDefEventsRole64113C5F","Arn"]},"ecsParameters":{"taskCount":2,"taskDefinitionArn":{"Ref":"ScheduledEc2TaskScheduledTaskDef56328BA4"},"propagateTags":"TASK_DEFINITION","tagList":[{"key":"my-tag","value":"my-tag-value"}]},"input":"{}"}]}}}}},"ScheduledTaskDef":{"id":"ScheduledTaskDef","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/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-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/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":[{"cpu":1,"essential":true,"image":"amazon/amazon-ecs-sample","memory":512,"name":"ScheduledContainer","logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"ScheduledEc2TaskScheduledTaskDefScheduledContainerLogGroupA85E11E6"},"awslogs-stream-prefix":"ScheduledEc2Task","awslogs-region":{"Ref":"AWS::Region"}}},"environment":[{"name":"TRIGGER","value":"CloudWatch Events"}]}],"executionRoleArn":{"Fn::GetAtt":["ScheduledEc2TaskScheduledTaskDefExecutionRole65A8CC6F","Arn"]},"family":"awsecsintegecsScheduledEc2TaskScheduledTaskDef18FB4348","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["ScheduledEc2TaskScheduledTaskDefTaskRoleC3FA127C","Arn"]}}}},"ScheduledContainer":{"id":"ScheduledContainer","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ScheduledContainer","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"LogGroup":{"id":"LogGroup","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ScheduledContainer/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ScheduledContainer/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ExecutionRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/ExecutionRole/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":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ScheduledEc2TaskScheduledTaskDefScheduledContainerLogGroupA85E11E6","Arn"]}}],"Version":"2012-10-17"},"policyName":"ScheduledEc2TaskScheduledTaskDefExecutionRoleDefaultPolicy6E8BCBB0","roles":[{"Ref":"ScheduledEc2TaskScheduledTaskDefExecutionRole65A8CC6F"}]}}}}}}},"EventsRole":{"id":"EventsRole","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/EventsRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportEventsRole":{"id":"ImportEventsRole","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/EventsRole/ImportEventsRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/EventsRole/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":"events.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/EventsRole/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-ecs-integ-ecs/ScheduledEc2Task/ScheduledTaskDef/EventsRole/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:RunTask","Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]}}},"Effect":"Allow","Resource":{"Ref":"ScheduledEc2TaskScheduledTaskDef56328BA4"}},{"Action":"ecs:TagResource","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecs:",{"Ref":"AWS::Region"},":*:task/",{"Ref":"EcsCluster97242B84"},"/*"]]}},{"Action":"iam:PassRole","Effect":"Allow","Resource":{"Fn::GetAtt":["ScheduledEc2TaskScheduledTaskDefExecutionRole65A8CC6F","Arn"]}}],"Version":"2012-10-17"},"policyName":"ScheduledEc2TaskScheduledTaskDefEventsRoleDefaultPolicyA6C9177A","roles":[{"Ref":"ScheduledEc2TaskScheduledTaskDefEventsRole64113C5F"}]}}}}}}}}}}},"ScheduledEc2Task2":{"id":"ScheduledEc2Task2","path":"aws-ecs-integ-ecs/ScheduledEc2Task2","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.ScheduledEc2Task","version":"0.0.0"},"children":{"ScheduledEventRule":{"id":"ScheduledEventRule","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledEventRule","constructInfo":{"fqn":"aws-cdk-lib.aws_events.Rule","version":"0.0.0","metadata":[{"schedule":"*","ruleName":"*","enabled":"*"},{"addEventPattern":["*"]},{"addTarget":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledEventRule/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_events.CfnRule","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Events::Rule","aws:cdk:cloudformation:props":{"scheduleExpression":"rate(1 minute)","state":"ENABLED","targets":[{"id":"Target0","arn":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]},"roleArn":{"Fn::GetAtt":["ScheduledEc2Task2ScheduledTaskDefEventsRoleE4A47A7F","Arn"]},"ecsParameters":{"taskCount":2,"taskDefinitionArn":{"Ref":"ScheduledEc2Task2ScheduledTaskDef5A1A589E"},"propagateTags":"TASK_DEFINITION","tagList":[{"key":"my-tag","value":"my-tag-value"}]},"input":"{}"}]}}}}},"ScheduledTaskDef":{"id":"ScheduledTaskDef","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/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-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/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":[{"cpu":1,"essential":true,"image":"amazon/amazon-ecs-sample","memory":512,"name":"differentName","logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"ScheduledEc2Task2ScheduledTaskDefdifferentNameLogGroup576E34BD"},"awslogs-stream-prefix":"ScheduledEc2Task2","awslogs-region":{"Ref":"AWS::Region"}}},"environment":[{"name":"TRIGGER","value":"CloudWatch Events"}]}],"executionRoleArn":{"Fn::GetAtt":["ScheduledEc2Task2ScheduledTaskDefExecutionRoleC4A2CB80","Arn"]},"family":"awsecsintegecsScheduledEc2Task2ScheduledTaskDef4390684D","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["ScheduledEc2Task2ScheduledTaskDefTaskRoleF24CD72E","Arn"]}}}},"differentName":{"id":"differentName","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/differentName","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"LogGroup":{"id":"LogGroup","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/differentName/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/differentName/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/ExecutionRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/ExecutionRole/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":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ScheduledEc2Task2ScheduledTaskDefdifferentNameLogGroup576E34BD","Arn"]}}],"Version":"2012-10-17"},"policyName":"ScheduledEc2Task2ScheduledTaskDefExecutionRoleDefaultPolicy70781945","roles":[{"Ref":"ScheduledEc2Task2ScheduledTaskDefExecutionRoleC4A2CB80"}]}}}}}}},"EventsRole":{"id":"EventsRole","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/EventsRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportEventsRole":{"id":"ImportEventsRole","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/EventsRole/ImportEventsRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/EventsRole/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":"events.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/EventsRole/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-ecs-integ-ecs/ScheduledEc2Task2/ScheduledTaskDef/EventsRole/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:RunTask","Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]}}},"Effect":"Allow","Resource":{"Ref":"ScheduledEc2Task2ScheduledTaskDef5A1A589E"}},{"Action":"ecs:TagResource","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecs:",{"Ref":"AWS::Region"},":*:task/",{"Ref":"EcsCluster97242B84"},"/*"]]}},{"Action":"iam:PassRole","Effect":"Allow","Resource":{"Fn::GetAtt":["ScheduledEc2Task2ScheduledTaskDefExecutionRoleC4A2CB80","Arn"]}}],"Version":"2012-10-17"},"policyName":"ScheduledEc2Task2ScheduledTaskDefEventsRoleDefaultPolicyF5EB7640","roles":[{"Ref":"ScheduledEc2Task2ScheduledTaskDefEventsRoleE4A47A7F"}]}}}}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-ecs/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-ecs/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"scheduledEc2TaskTest":{"id":"scheduledEc2TaskTest","path":"scheduledEc2TaskTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"scheduledEc2TaskTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"scheduledEc2TaskTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"scheduledEc2TaskTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"scheduledEc2TaskTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"scheduledEc2TaskTest/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-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/cdk.out
index 3704a1b682acf..523a9aac37cbf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.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-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/integ.json
index 55640fc404d2a..d9b4e7df28539 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"testCases": {
"networkLoadBalancedEc2ServiceTest/DefaultTest": {
"stacks": [
@@ -9,5 +9,5 @@
"assertionStackName": "networkLoadBalancedEc2ServiceTestDefaultTestDeployAssert34DAD7DE"
}
},
- "minimumCliVersion": "2.1020.2"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/manifest.json
index 61f6f03e522f2..1627825a15342 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/manifest.json
@@ -18,7 +18,7 @@
"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}/16de6b9d8933bc3c72b7c98c56f1ce9201af800e7af59e3a40e91e11fc65d1e3.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/670861cabe340bc2ae38cc50ea635a38edb22952790da0e6711f6115acb390f6.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1238,57 +1238,44 @@
"properties": {
"module": "aws-cdk-lib",
"flags": {
- "@aws-cdk/core:enableStackNameDuplicates": {
+ "@aws-cdk/aws-signer:signingProfileNamePassedToCfn": {
"recommendedValue": true,
- "explanation": "Allow multiple stacks with the same name"
- },
- "aws-cdk:enableDiffNoFail": {
- "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"
- },
- "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
- "recommendedValue": true,
- "explanation": "Do not specify a default DesiredCount for ECS services"
+ "explanation": "Name exports based on the construct paths relative to the stack, rather than the global construct path",
+ "unconfiguredBehavesLike": {
+ "v2": true
+ }
},
"@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,
@@ -1297,7 +1284,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,
@@ -1518,7 +1508,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,
@@ -1547,7 +1540,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,
@@ -1611,7 +1607,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,
@@ -1645,7 +1644,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,
@@ -1668,7 +1670,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,
@@ -1703,5 +1708,5 @@
}
}
},
- "minimumCliVersion": "2.1023.0"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/networkLoadBalancedEc2ServiceTestDefaultTestDeployAssert34DAD7DE.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/networkLoadBalancedEc2ServiceTestDefaultTestDeployAssert34DAD7DE.assets.json
index 6bf27229083a6..9a44d7fb6e1b0 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/networkLoadBalancedEc2ServiceTestDefaultTestDeployAssert34DAD7DE.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/networkLoadBalancedEc2ServiceTestDefaultTestDeployAssert34DAD7DE.assets.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
"displayName": "networkLoadBalancedEc2ServiceTestDefaultTestDeployAssert34DAD7DE Template",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/tls-network-load-balanced-ecs-service.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/tls-network-load-balanced-ecs-service.assets.json
index 649fbdedf30f4..fdd837a2b23ab 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/tls-network-load-balanced-ecs-service.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/tls-network-load-balanced-ecs-service.assets.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"files": {
"a1acfc2b5f4f6b183fd2bb9863f486bc5edef6a357b355a070d9a0e502df418c": {
"displayName": "tls-network-load-balanced-ecs-service/Custom::VpcRestrictDefaultSGCustomResourceProvider Code",
@@ -15,16 +15,16 @@
}
}
},
- "16de6b9d8933bc3c72b7c98c56f1ce9201af800e7af59e3a40e91e11fc65d1e3": {
+ "670861cabe340bc2ae38cc50ea635a38edb22952790da0e6711f6115acb390f6": {
"displayName": "tls-network-load-balanced-ecs-service Template",
"source": {
"path": "tls-network-load-balanced-ecs-service.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region-cca6254a": {
+ "current_account-current_region-be8bfe26": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "16de6b9d8933bc3c72b7c98c56f1ce9201af800e7af59e3a40e91e11fc65d1e3.json",
+ "objectKey": "670861cabe340bc2ae38cc50ea635a38edb22952790da0e6711f6115acb390f6.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/tls-network-load-balanced-ecs-service.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/tls-network-load-balanced-ecs-service.template.json
index 4b28ae26ee715..7d5cff7ea3a8f 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/tls-network-load-balanced-ecs-service.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/tls-network-load-balanced-ecs-service.template.json
@@ -872,7 +872,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -888,7 +888,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/tree.json
index 57b6d125b4444..f351aae60400c 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/ec2/integ.tls-network-load-balanced-ecs-service.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":{"tls-network-load-balanced-ecs-service":{"id":"tls-network-load-balanced-ecs-service","path":"tls-network-load-balanced-ecs-service","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"tls-network-load-balanced-ecs-service/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"tls-network-load-balanced-ecs-service/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"tls-network-load-balanced-ecs-service/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"tls-network-load-balanced-ecs-service/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"tls-network-load-balanced-ecs-service/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"tls-network-load-balanced-ecs-service/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"tls-network-load-balanced-ecs-service/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"tls-network-load-balanced-ecs-service/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"tls-network-load-balanced-ecs-service/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"tls-network-load-balanced-ecs-service/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"tls-network-load-balanced-ecs-service/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"tls-network-load-balanced-ecs-service/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"tls-network-load-balanced-ecs-service/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"tls-network-load-balanced-ecs-service/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"tls-network-load-balanced-ecs-service/Vpc/RestrictDefaultSecurityGroupCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"tls-network-load-balanced-ecs-service/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"tls-network-load-balanced-ecs-service/Custom::VpcRestrictDefaultSGCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"tls-network-load-balanced-ecs-service/Custom::VpcRestrictDefaultSGCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"tls-network-load-balanced-ecs-service/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"tls-network-load-balanced-ecs-service/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Cluster":{"id":"Cluster","path":"tls-network-load-balanced-ecs-service/Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addCapacity":["*",{"instanceType":"*","desiredCapacity":"*"}]},{"addAutoScalingGroup":["*",{"machineImageType":0}]}]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/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":{}}},"DefaultAutoScalingGroupCapacity":{"id":"DefaultAutoScalingGroupCapacity","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","instanceType":"*","desiredCapacity":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":["ClusterEB0386A7","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ClusterDefaultAutoScalingGroupCapacityInstanceRoleDefaultPolicy3AE7CD94","roles":[{"Ref":"ClusterDefaultAutoScalingGroupCapacityInstanceRoleDDFBFB36"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"ClusterDefaultAutoScalingGroupCapacityInstanceRoleDDFBFB36"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":["ClusterDefaultAutoScalingGroupCapacityInstanceProfile3A782F9C","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.small","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupCapacityInstanceSecurityGroup1280FF15","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"ClusterEB0386A7"}," >> /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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":{"desiredCapacity":"2","launchTemplate":{"launchTemplateId":{"Ref":"ClusterDefaultAutoScalingGroupCapacityLaunchTemplate9380B460"},"version":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupCapacityLaunchTemplate9380B460","LatestVersionNumber"]}},"maxSize":"2","minSize":"1","tags":[{"key":"Name","value":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"ClusterDefaultAutoScalingGroupCapacityASGA16CBFC4"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}],"Version":"2012-10-17"},"policyName":"ClusterDefaultAutoScalingGroupCapacityDrainECSHookFunctionServiceRoleDefaultPolicy7671EAB6","roles":[{"Ref":"ClusterDefaultAutoScalingGroupCapacityDrainECSHookFunctionServiceRoleF852A559"}]}}}}}}},"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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('Got event without EC2InstanceId: %s', 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":"ClusterEB0386A7"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupCapacityDrainECSHookFunctionServiceRoleF852A559","Arn"]},"runtime":"python3.9","tags":[{"key":"Name","value":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity"}],"timeout":310}}},"AllowInvoke:tlsnetworkloadbalancedecsserviceClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookTopic6592E560":{"id":"AllowInvoke:tlsnetworkloadbalancedecsserviceClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookTopic6592E560","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/DrainECSHook/Function/AllowInvoke:tlsnetworkloadbalancedecsserviceClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookTopic6592E560","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":["ClusterDefaultAutoScalingGroupCapacityDrainECSHookFunction0FED543D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookTopic3C09C53E"}}}},"Topic":{"id":"Topic","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":["ClusterDefaultAutoScalingGroupCapacityDrainECSHookFunction0FED543D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookTopic3C09C53E"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity"}]}}}}},"Role":{"id":"Role","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/LifecycleHookDrainHook/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"ClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookTopic3C09C53E"}}],"Version":"2012-10-17"},"policyName":"ClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookRoleDefaultPolicyD2150D5F","roles":[{"Ref":"ClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookRole3F8332FE"}]}}}}}}},"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"ClusterDefaultAutoScalingGroupCapacityASGA16CBFC4"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookTopic3C09C53E"},"roleArn":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookRole3F8332FE","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":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/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":[]}},"myCert":{"id":"myCert","path":"tls-network-load-balanced-ecs-service/myCert","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"myServiceWithTls":{"id":"myServiceWithTls","path":"tls-network-load-balanced-ecs-service/myServiceWithTls","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.NetworkLoadBalancedEc2Service","version":"0.0.0"},"children":{"LB":{"id":"LB","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/LB","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.NetworkLoadBalancer","version":"0.0.0","metadata":["*","*"]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/LB/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnLoadBalancer","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::LoadBalancer","aws:cdk:cloudformation:props":{"loadBalancerAttributes":[{"key":"deletion_protection.enabled","value":"false"}],"scheme":"internet-facing","subnets":[{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},{"Ref":"VpcPublicSubnet2Subnet691E08A3"}],"type":"network"}}},"PublicListener":{"id":"PublicListener","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/LB/PublicListener","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.NetworkListener","version":"0.0.0","metadata":["*","*","*","*"]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/LB/PublicListener/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnListener","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::Listener","aws:cdk:cloudformation:props":{"certificates":[{"certificateArn":"arn:aws:acm:test-region:12345678:certificate/86468209-a272-595d-b831-0efb6421265z"}],"defaultActions":[{"type":"forward","targetGroupArn":{"Ref":"myServiceWithTlsLBPublicListenerECSGroup39AE2653"}}],"loadBalancerArn":{"Ref":"myServiceWithTlsLB43A9E2DA"},"port":443,"protocol":"TLS"}}},"ECSGroup":{"id":"ECSGroup","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/LB/PublicListener/ECSGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.NetworkTargetGroup","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/LB/PublicListener/ECSGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::TargetGroup","aws:cdk:cloudformation:props":{"port":443,"protocol":"TLS","targetType":"instance","vpcId":{"Ref":"Vpc8378EB38"}}}}}}}}}},"LoadBalancerDNS":{"id":"LoadBalancerDNS","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/LoadBalancerDNS","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"TaskDef":{"id":"TaskDef","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/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":"tls-network-load-balanced-ecs-service/myServiceWithTls/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","portMappings":[{"containerPort":80,"hostPort":0,"protocol":"tcp"}],"logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"myServiceWithTlsTaskDefwebLogGroup4E6CDA77"},"awslogs-stream-prefix":"myServiceWithTls","awslogs-region":{"Ref":"AWS::Region"}}}}],"executionRoleArn":{"Fn::GetAtt":["myServiceWithTlsTaskDefExecutionRoleE8E9CE52","Arn"]},"family":"tlsnetworkloadbalancedecsservicemyServiceWithTlsTaskDef6FDD51CA","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["myServiceWithTlsTaskDefTaskRoleEF85024F","Arn"]}}}},"web":{"id":"web","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"LogGroup":{"id":"LogGroup","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/web/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/web/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/ExecutionRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/ExecutionRole/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":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["myServiceWithTlsTaskDefwebLogGroup4E6CDA77","Arn"]}}],"Version":"2012-10-17"},"policyName":"myServiceWithTlsTaskDefExecutionRoleDefaultPolicyED1CC7D2","roles":[{"Ref":"myServiceWithTlsTaskDefExecutionRoleE8E9CE52"}]}}}}}}}}},"Service":{"id":"Service","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/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":"ClusterEB0386A7"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"healthCheckGracePeriodSeconds":60,"launchType":"EC2","loadBalancers":[{"targetGroupArn":{"Ref":"myServiceWithTlsLBPublicListenerECSGroup39AE2653"},"containerName":"web","containerPort":80}],"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"myServiceWithTlsTaskDef3132768A"}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"tls-network-load-balanced-ecs-service/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"tls-network-load-balanced-ecs-service/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"networkLoadBalancedEc2ServiceTest":{"id":"networkLoadBalancedEc2ServiceTest","path":"networkLoadBalancedEc2ServiceTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"networkLoadBalancedEc2ServiceTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"networkLoadBalancedEc2ServiceTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"networkLoadBalancedEc2ServiceTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"networkLoadBalancedEc2ServiceTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"networkLoadBalancedEc2ServiceTest/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
+{"version":"tree-0.1","tree":{"id":"App","path":"","constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.0.0"},"children":{"tls-network-load-balanced-ecs-service":{"id":"tls-network-load-balanced-ecs-service","path":"tls-network-load-balanced-ecs-service","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"tls-network-load-balanced-ecs-service/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"tls-network-load-balanced-ecs-service/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"tls-network-load-balanced-ecs-service/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"tls-network-load-balanced-ecs-service/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"tls-network-load-balanced-ecs-service/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"tls-network-load-balanced-ecs-service/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"tls-network-load-balanced-ecs-service/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"tls-network-load-balanced-ecs-service/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"tls-network-load-balanced-ecs-service/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"tls-network-load-balanced-ecs-service/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"tls-network-load-balanced-ecs-service/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"tls-network-load-balanced-ecs-service/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"tls-network-load-balanced-ecs-service/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"tls-network-load-balanced-ecs-service/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"tls-network-load-balanced-ecs-service/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"tls-network-load-balanced-ecs-service/Vpc/RestrictDefaultSecurityGroupCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"tls-network-load-balanced-ecs-service/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"tls-network-load-balanced-ecs-service/Custom::VpcRestrictDefaultSGCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"tls-network-load-balanced-ecs-service/Custom::VpcRestrictDefaultSGCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"tls-network-load-balanced-ecs-service/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"tls-network-load-balanced-ecs-service/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Cluster":{"id":"Cluster","path":"tls-network-load-balanced-ecs-service/Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addCapacity":["*",{"instanceType":"*","desiredCapacity":"*"}]},{"addAutoScalingGroup":["*",{"machineImageType":0}]}]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/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":{}}},"DefaultAutoScalingGroupCapacity":{"id":"DefaultAutoScalingGroupCapacity","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","instanceType":"*","desiredCapacity":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":["ClusterEB0386A7","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ClusterDefaultAutoScalingGroupCapacityInstanceRoleDefaultPolicy3AE7CD94","roles":[{"Ref":"ClusterDefaultAutoScalingGroupCapacityInstanceRoleDDFBFB36"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"ClusterDefaultAutoScalingGroupCapacityInstanceRoleDDFBFB36"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":["ClusterDefaultAutoScalingGroupCapacityInstanceProfile3A782F9C","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.small","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupCapacityInstanceSecurityGroup1280FF15","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"ClusterEB0386A7"}," >> /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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":{"desiredCapacity":"2","launchTemplate":{"launchTemplateId":{"Ref":"ClusterDefaultAutoScalingGroupCapacityLaunchTemplate9380B460"},"version":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupCapacityLaunchTemplate9380B460","LatestVersionNumber"]}},"maxSize":"2","minSize":"1","tags":[{"key":"Name","value":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"ClusterDefaultAutoScalingGroupCapacityASGA16CBFC4"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}],"Version":"2012-10-17"},"policyName":"ClusterDefaultAutoScalingGroupCapacityDrainECSHookFunctionServiceRoleDefaultPolicy7671EAB6","roles":[{"Ref":"ClusterDefaultAutoScalingGroupCapacityDrainECSHookFunctionServiceRoleF852A559"}]}}}}}}},"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"ClusterEB0386A7"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupCapacityDrainECSHookFunctionServiceRoleF852A559","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity"}],"timeout":310}}},"AllowInvoke:tlsnetworkloadbalancedecsserviceClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookTopic6592E560":{"id":"AllowInvoke:tlsnetworkloadbalancedecsserviceClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookTopic6592E560","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/DrainECSHook/Function/AllowInvoke:tlsnetworkloadbalancedecsserviceClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookTopic6592E560","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":["ClusterDefaultAutoScalingGroupCapacityDrainECSHookFunction0FED543D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookTopic3C09C53E"}}}},"Topic":{"id":"Topic","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":["ClusterDefaultAutoScalingGroupCapacityDrainECSHookFunction0FED543D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookTopic3C09C53E"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity"}]}}}}},"Role":{"id":"Role","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/LifecycleHookDrainHook/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"ClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookTopic3C09C53E"}}],"Version":"2012-10-17"},"policyName":"ClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookRoleDefaultPolicyD2150D5F","roles":[{"Ref":"ClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookRole3F8332FE"}]}}}}}}},"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/Cluster/DefaultAutoScalingGroupCapacity/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":"ClusterDefaultAutoScalingGroupCapacityASGA16CBFC4"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookTopic3C09C53E"},"roleArn":{"Fn::GetAtt":["ClusterDefaultAutoScalingGroupCapacityLifecycleHookDrainHookRole3F8332FE","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":"tls-network-load-balanced-ecs-service/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":"tls-network-load-balanced-ecs-service/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":[]}},"myCert":{"id":"myCert","path":"tls-network-load-balanced-ecs-service/myCert","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"myServiceWithTls":{"id":"myServiceWithTls","path":"tls-network-load-balanced-ecs-service/myServiceWithTls","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.NetworkLoadBalancedEc2Service","version":"0.0.0"},"children":{"LB":{"id":"LB","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/LB","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.NetworkLoadBalancer","version":"0.0.0","metadata":["*","*"]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/LB/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnLoadBalancer","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::LoadBalancer","aws:cdk:cloudformation:props":{"loadBalancerAttributes":[{"key":"deletion_protection.enabled","value":"false"}],"scheme":"internet-facing","subnets":[{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},{"Ref":"VpcPublicSubnet2Subnet691E08A3"}],"type":"network"}}},"PublicListener":{"id":"PublicListener","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/LB/PublicListener","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.NetworkListener","version":"0.0.0","metadata":["*","*","*","*"]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/LB/PublicListener/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnListener","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::Listener","aws:cdk:cloudformation:props":{"certificates":[{"certificateArn":"arn:aws:acm:test-region:12345678:certificate/86468209-a272-595d-b831-0efb6421265z"}],"defaultActions":[{"type":"forward","targetGroupArn":{"Ref":"myServiceWithTlsLBPublicListenerECSGroup39AE2653"}}],"loadBalancerArn":{"Ref":"myServiceWithTlsLB43A9E2DA"},"port":443,"protocol":"TLS"}}},"ECSGroup":{"id":"ECSGroup","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/LB/PublicListener/ECSGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.NetworkTargetGroup","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/LB/PublicListener/ECSGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::TargetGroup","aws:cdk:cloudformation:props":{"port":443,"protocol":"TLS","targetType":"instance","vpcId":{"Ref":"Vpc8378EB38"}}}}}}}}}},"LoadBalancerDNS":{"id":"LoadBalancerDNS","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/LoadBalancerDNS","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"TaskDef":{"id":"TaskDef","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/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":"tls-network-load-balanced-ecs-service/myServiceWithTls/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","portMappings":[{"containerPort":80,"hostPort":0,"protocol":"tcp"}],"logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"myServiceWithTlsTaskDefwebLogGroup4E6CDA77"},"awslogs-stream-prefix":"myServiceWithTls","awslogs-region":{"Ref":"AWS::Region"}}}}],"executionRoleArn":{"Fn::GetAtt":["myServiceWithTlsTaskDefExecutionRoleE8E9CE52","Arn"]},"family":"tlsnetworkloadbalancedecsservicemyServiceWithTlsTaskDef6FDD51CA","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["myServiceWithTlsTaskDefTaskRoleEF85024F","Arn"]}}}},"web":{"id":"web","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"LogGroup":{"id":"LogGroup","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/web/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/web/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/ExecutionRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/TaskDef/ExecutionRole/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":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["myServiceWithTlsTaskDefwebLogGroup4E6CDA77","Arn"]}}],"Version":"2012-10-17"},"policyName":"myServiceWithTlsTaskDefExecutionRoleDefaultPolicyED1CC7D2","roles":[{"Ref":"myServiceWithTlsTaskDefExecutionRoleE8E9CE52"}]}}}}}}}}},"Service":{"id":"Service","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"tls-network-load-balanced-ecs-service/myServiceWithTls/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":"ClusterEB0386A7"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"healthCheckGracePeriodSeconds":60,"launchType":"EC2","loadBalancers":[{"targetGroupArn":{"Ref":"myServiceWithTlsLBPublicListenerECSGroup39AE2653"},"containerName":"web","containerPort":80}],"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"myServiceWithTlsTaskDef3132768A"}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"tls-network-load-balanced-ecs-service/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"tls-network-load-balanced-ecs-service/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"networkLoadBalancedEc2ServiceTest":{"id":"networkLoadBalancedEc2ServiceTest","path":"networkLoadBalancedEc2ServiceTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"networkLoadBalancedEc2ServiceTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"networkLoadBalancedEc2ServiceTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"networkLoadBalancedEc2ServiceTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"networkLoadBalancedEc2ServiceTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"networkLoadBalancedEc2ServiceTest/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-patterns/test/fargate/integ.nlb-sg.js.snapshot/aws-ecs-integ-lb-fargate.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/aws-ecs-integ-lb-fargate.assets.json
index 17197614dcd47..6e56b17eeac5a 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/aws-ecs-integ-lb-fargate.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/aws-ecs-integ-lb-fargate.assets.json
@@ -1,13 +1,14 @@
{
- "version": "36.0.0",
+ "version": "45.0.0",
"files": {
"01677902a566d4c905bae44eaf146aefbe867b471036ab56d5abe5f9622c0ccd": {
+ "displayName": "aws-ecs-integ-lb-fargate Template",
"source": {
"path": "aws-ecs-integ-lb-fargate.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-7396a244": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
"objectKey": "01677902a566d4c905bae44eaf146aefbe867b471036ab56d5abe5f9622c0ccd.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/cdk.out
index 1f0068d32659a..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"36.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/integ.json
index 6d95f61c34e55..b6264b5905587 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "36.0.0",
+ "version": "45.0.0",
"testCases": {
"l3FargateTest/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "l3FargateTest/DefaultTest/DeployAssert",
"assertionStackName": "l3FargateTestDefaultTestDeployAssert3391A20B"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/l3FargateTestDefaultTestDeployAssert3391A20B.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/l3FargateTestDefaultTestDeployAssert3391A20B.assets.json
index 4e6f5d15656c9..662d826feb28e 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/l3FargateTestDefaultTestDeployAssert3391A20B.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/l3FargateTestDefaultTestDeployAssert3391A20B.assets.json
@@ -1,13 +1,14 @@
{
- "version": "36.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "l3FargateTestDefaultTestDeployAssert3391A20B Template",
"source": {
"path": "l3FargateTestDefaultTestDeployAssert3391A20B.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/manifest.json
index 796449a3f0f70..c9bb8f3727a7f 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "36.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ-lb-fargate.assets": {
"type": "cdk:asset-manifest",
@@ -34,12 +34,57 @@
"aws-ecs-integ-lb-fargate.assets"
],
"metadata": {
+ "/aws-ecs-integ-lb-fargate/Vpc": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "maxAzs": "*",
+ "restrictDefaultSecurityGroup": false
+ }
+ }
+ ],
"/aws-ecs-integ-lb-fargate/Vpc/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "Vpc8378EB38"
}
],
+ "/aws-ecs-integ-lb-fargate/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": [
+ "*"
+ ]
+ }
+ }
+ ],
"/aws-ecs-integ-lb-fargate/Vpc/PublicSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -76,6 +121,42 @@
"data": "VpcPublicSubnet1NATGateway4D7517AA"
}
],
+ "/aws-ecs-integ-lb-fargate/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": [
+ "*"
+ ]
+ }
+ }
+ ],
"/aws-ecs-integ-lb-fargate/Vpc/PublicSubnet2/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -112,6 +193,34 @@
"data": "VpcPublicSubnet2NATGateway9182C01D"
}
],
+ "/aws-ecs-integ-lb-fargate/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": {}
+ }
+ ],
"/aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -136,6 +245,34 @@
"data": "VpcPrivateSubnet1DefaultRouteBE02A9ED"
}
],
+ "/aws-ecs-integ-lb-fargate/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": {}
+ }
+ ],
"/aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet2/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -172,30 +309,106 @@
"data": "VpcVPCGWBF912B6E"
}
],
+ "/aws-ecs-integ-lb-fargate/FargateCluster": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ }
+ ],
"/aws-ecs-integ-lb-fargate/FargateCluster/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "FargateCluster7CCD5F93"
}
],
+ "/aws-ecs-integ-lb-fargate/SecurityGroupNlb": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*",
+ "allowAllOutbound": true
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addIngressRule": [
+ {
+ "canInlineRule": true,
+ "connections": "*",
+ "uniqueId": "*"
+ },
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-integ-lb-fargate/SecurityGroupNlb/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "SecurityGroupNlbFA132873"
}
],
+ "/aws-ecs-integ-lb-fargate/SecurityGroupService": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*",
+ "allowAllOutbound": true
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addIngressRule": [
+ {
+ "canInlineRule": true,
+ "connections": "*",
+ "uniqueId": "*"
+ },
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-integ-lb-fargate/SecurityGroupService/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "SecurityGroupServiceDE1E5E6A"
}
],
+ "/aws-ecs-integ-lb-fargate/NLBFargateService/LB": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ }
+ ],
"/aws-ecs-integ-lb-fargate/NLBFargateService/LB/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "NLBFargateServiceLB659EC17C"
}
],
+ "/aws-ecs-integ-lb-fargate/NLBFargateService/LB/PublicListener": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ }
+ ],
"/aws-ecs-integ-lb-fargate/NLBFargateService/LB/PublicListener/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -214,6 +427,45 @@
"data": "NLBFargateServiceLoadBalancerDNSC2B2922F"
}
],
+ "/aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ }
+ ],
+ "/aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/TaskRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "assumedBy": {
+ "principalAccount": "*",
+ "assumeRoleAction": "*"
+ }
+ }
+ }
+ ],
+ "/aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/TaskRole/ImportTaskRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/TaskRole/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -226,24 +478,114 @@
"data": "NLBFargateServiceTaskDefB836FA89"
}
],
+ "/aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/web/LogGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "retention": "*"
+ }
+ }
+ ],
"/aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/web/LogGroup/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "NLBFargateServiceTaskDefwebLogGroupC4A42FE2"
}
],
+ "/aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/ExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "assumedBy": {
+ "principalAccount": "*",
+ "assumeRoleAction": "*"
+ },
+ "roleName": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addToPrincipalPolicy": [
+ {}
+ ]
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "attachInlinePolicy": [
+ "*"
+ ]
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "attachInlinePolicy": [
+ "*"
+ ]
+ }
+ }
+ ],
+ "/aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/ExecutionRole/ImportExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/ExecutionRole/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "NLBFargateServiceTaskDefExecutionRoleF6D642D5"
}
],
+ "/aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/ExecutionRole/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": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/ExecutionRole/DefaultPolicy/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "NLBFargateServiceTaskDefExecutionRoleDefaultPolicy90080805"
}
],
+ "/aws-ecs-integ-lb-fargate/NLBFargateService/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": "*"
+ }
+ ],
"/aws-ecs-integ-lb-fargate/NLBFargateService/Service/Service": [
{
"type": "aws:cdk:logicalId",
@@ -318,6 +660,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/tree.json
index 8e06bfa34093f..771f614a9ed7f 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.nlb-sg.js.snapshot/tree.json
@@ -1,1304 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ-lb-fargate": {
- "id": "aws-ecs-integ-lb-fargate",
- "path": "aws-ecs-integ-lb-fargate",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ-lb-fargate/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-lb-fargate/Vpc/Resource",
- "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-ecs-integ-lb-fargate/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ-lb-fargate/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
- "version": "0.0.0"
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ-lb-fargate/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-lb-fargate/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
- "version": "0.0.0"
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ-lb-fargate/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
- "version": "0.0.0"
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ-lb-fargate/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
- "version": "0.0.0"
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ-lb-fargate/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-lb-fargate/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ-lb-fargate/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0"
- }
- },
- "FargateCluster": {
- "id": "FargateCluster",
- "path": "aws-ecs-integ-lb-fargate/FargateCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-lb-fargate/FargateCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0"
- }
- },
- "SecurityGroupNlb": {
- "id": "SecurityGroupNlb",
- "path": "aws-ecs-integ-lb-fargate/SecurityGroupNlb",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-lb-fargate/SecurityGroupNlb/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-lb-fargate/SecurityGroupNlb",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "securityGroupIngress": [
- {
- "cidrIp": "0.0.0.0/0",
- "ipProtocol": "tcp",
- "fromPort": 32768,
- "toPort": 65535,
- "description": "from 0.0.0.0/0:32768-65535"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0"
- }
- },
- "SecurityGroupService": {
- "id": "SecurityGroupService",
- "path": "aws-ecs-integ-lb-fargate/SecurityGroupService",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-lb-fargate/SecurityGroupService/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-lb-fargate/SecurityGroupService",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "securityGroupIngress": [
- {
- "sourceSecurityGroupId": {
- "Fn::GetAtt": [
- "SecurityGroupNlbFA132873",
- "GroupId"
- ]
- },
- "ipProtocol": "tcp",
- "fromPort": 0,
- "toPort": 65535,
- "description": {
- "Fn::Join": [
- "",
- [
- "from ",
- {
- "Fn::GetAtt": [
- "SecurityGroupNlbFA132873",
- "GroupId"
- ]
- },
- ":ALL PORTS"
- ]
- ]
- }
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0"
- }
- },
- "NLBFargateService": {
- "id": "NLBFargateService",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService",
- "children": {
- "LB": {
- "id": "LB",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/LB",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/LB/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
- "aws:cdk:cloudformation:props": {
- "loadBalancerAttributes": [
- {
- "key": "deletion_protection.enabled",
- "value": "false"
- }
- ],
- "scheme": "internet-facing",
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "SecurityGroupNlbFA132873",
- "GroupId"
- ]
- }
- ],
- "subnets": [
- {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- ],
- "type": "network"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnLoadBalancer",
- "version": "0.0.0"
- }
- },
- "PublicListener": {
- "id": "PublicListener",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/LB/PublicListener",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/LB/PublicListener/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::Listener",
- "aws:cdk:cloudformation:props": {
- "defaultActions": [
- {
- "type": "forward",
- "targetGroupArn": {
- "Ref": "NLBFargateServiceLBPublicListenerECSGroupC469CAA2"
- }
- }
- ],
- "loadBalancerArn": {
- "Ref": "NLBFargateServiceLB659EC17C"
- },
- "port": 80,
- "protocol": "TCP"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnListener",
- "version": "0.0.0"
- }
- },
- "ECSGroup": {
- "id": "ECSGroup",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/LB/PublicListener/ECSGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/LB/PublicListener/ECSGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::TargetGroup",
- "aws:cdk:cloudformation:props": {
- "port": 80,
- "protocol": "TCP",
- "targetType": "ip",
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.NetworkTargetGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.NetworkListener",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.NetworkLoadBalancer",
- "version": "0.0.0"
- }
- },
- "LoadBalancerDNS": {
- "id": "LoadBalancerDNS",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/LoadBalancerDNS",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "TaskDef": {
- "id": "TaskDef",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "name": "web",
- "portMappings": [
- {
- "containerPort": 80,
- "protocol": "tcp"
- }
- ],
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": {
- "Ref": "NLBFargateServiceTaskDefwebLogGroupC4A42FE2"
- },
- "awslogs-stream-prefix": "NLBFargateService",
- "awslogs-region": {
- "Ref": "AWS::Region"
- }
- }
- }
- }
- ],
- "cpu": "512",
- "executionRoleArn": {
- "Fn::GetAtt": [
- "NLBFargateServiceTaskDefExecutionRoleF6D642D5",
- "Arn"
- ]
- },
- "family": "awsecsinteglbfargateNLBFargateServiceTaskDef1265FF34",
- "memory": "1024",
- "networkMode": "awsvpc",
- "requiresCompatibilities": [
- "FARGATE"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "NLBFargateServiceTaskDefTaskRole6C88F40B",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "web": {
- "id": "web",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/web",
- "children": {
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/web/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/web/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "NLBFargateServiceTaskDefwebLogGroupC4A42FE2",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "NLBFargateServiceTaskDefExecutionRoleDefaultPolicy90080805",
- "roles": [
- {
- "Ref": "NLBFargateServiceTaskDefExecutionRoleF6D642D5"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.FargateTaskDefinition",
- "version": "0.0.0"
- }
- },
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/Service",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-lb-fargate/NLBFargateService/Service/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "FargateCluster7CCD5F93"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50,
- "alarms": {
- "alarmNames": [],
- "enable": false,
- "rollback": false
- }
- },
- "enableEcsManagedTags": false,
- "healthCheckGracePeriodSeconds": 60,
- "launchType": "FARGATE",
- "loadBalancers": [
- {
- "targetGroupArn": {
- "Ref": "NLBFargateServiceLBPublicListenerECSGroupC469CAA2"
- },
- "containerName": "web",
- "containerPort": 80
- }
- ],
- "networkConfiguration": {
- "awsvpcConfiguration": {
- "assignPublicIp": "DISABLED",
- "subnets": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ],
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "SecurityGroupServiceDE1E5E6A",
- "GroupId"
- ]
- }
- ]
- }
- },
- "taskDefinition": {
- "Ref": "NLBFargateServiceTaskDefB836FA89"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.FargateService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs_patterns.NetworkLoadBalancedFargateService",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-lb-fargate/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-lb-fargate/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "l3FargateTest": {
- "id": "l3FargateTest",
- "path": "l3FargateTest",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "l3FargateTest/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "l3FargateTest/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.3.0"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "l3FargateTest/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "l3FargateTest/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "l3FargateTest/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.3.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ-lb-fargate":{"id":"aws-ecs-integ-lb-fargate","path":"aws-ecs-integ-lb-fargate","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-lb-fargate/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-lb-fargate/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-lb-fargate/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-lb-fargate/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-lb-fargate/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-lb-fargate/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-lb-fargate/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-lb-fargate/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-lb-fargate/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-lb-fargate/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ-lb-fargate/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-lb-fargate/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-lb-fargate/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-lb-fargate/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-lb-fargate/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-lb-fargate/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-lb-fargate/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-ecs-integ-lb-fargate/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-lb-fargate/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"FargateCluster":{"id":"FargateCluster","path":"aws-ecs-integ-lb-fargate/FargateCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-lb-fargate/FargateCluster/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":{}}}}},"SecurityGroupNlb":{"id":"SecurityGroupNlb","path":"aws-ecs-integ-lb-fargate/SecurityGroupNlb","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true},{"addIngressRule":[{"canInlineRule":true,"connections":"*","uniqueId":"*"},{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-lb-fargate/SecurityGroupNlb/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-ecs-integ-lb-fargate/SecurityGroupNlb","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"securityGroupIngress":[{"cidrIp":"0.0.0.0/0","ipProtocol":"tcp","fromPort":32768,"toPort":65535,"description":"from 0.0.0.0/0:32768-65535"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"SecurityGroupService":{"id":"SecurityGroupService","path":"aws-ecs-integ-lb-fargate/SecurityGroupService","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true},{"addIngressRule":[{"canInlineRule":true,"connections":"*","uniqueId":"*"},{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-lb-fargate/SecurityGroupService/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-ecs-integ-lb-fargate/SecurityGroupService","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"securityGroupIngress":[{"sourceSecurityGroupId":{"Fn::GetAtt":["SecurityGroupNlbFA132873","GroupId"]},"ipProtocol":"tcp","fromPort":0,"toPort":65535,"description":{"Fn::Join":["",["from ",{"Fn::GetAtt":["SecurityGroupNlbFA132873","GroupId"]},":ALL PORTS"]]}}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"NLBFargateService":{"id":"NLBFargateService","path":"aws-ecs-integ-lb-fargate/NLBFargateService","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.NetworkLoadBalancedFargateService","version":"0.0.0"},"children":{"LB":{"id":"LB","path":"aws-ecs-integ-lb-fargate/NLBFargateService/LB","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.NetworkLoadBalancer","version":"0.0.0","metadata":["*","*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-lb-fargate/NLBFargateService/LB/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnLoadBalancer","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::LoadBalancer","aws:cdk:cloudformation:props":{"loadBalancerAttributes":[{"key":"deletion_protection.enabled","value":"false"}],"scheme":"internet-facing","securityGroups":[{"Fn::GetAtt":["SecurityGroupNlbFA132873","GroupId"]}],"subnets":[{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},{"Ref":"VpcPublicSubnet2Subnet691E08A3"}],"type":"network"}}},"PublicListener":{"id":"PublicListener","path":"aws-ecs-integ-lb-fargate/NLBFargateService/LB/PublicListener","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.NetworkListener","version":"0.0.0","metadata":["*","*","*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-lb-fargate/NLBFargateService/LB/PublicListener/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnListener","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::Listener","aws:cdk:cloudformation:props":{"defaultActions":[{"type":"forward","targetGroupArn":{"Ref":"NLBFargateServiceLBPublicListenerECSGroupC469CAA2"}}],"loadBalancerArn":{"Ref":"NLBFargateServiceLB659EC17C"},"port":80,"protocol":"TCP"}}},"ECSGroup":{"id":"ECSGroup","path":"aws-ecs-integ-lb-fargate/NLBFargateService/LB/PublicListener/ECSGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.NetworkTargetGroup","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-lb-fargate/NLBFargateService/LB/PublicListener/ECSGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::TargetGroup","aws:cdk:cloudformation:props":{"port":80,"protocol":"TCP","targetType":"ip","vpcId":{"Ref":"Vpc8378EB38"}}}}}}}}}},"LoadBalancerDNS":{"id":"LoadBalancerDNS","path":"aws-ecs-integ-lb-fargate/NLBFargateService/LoadBalancerDNS","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"TaskDef":{"id":"TaskDef","path":"aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateTaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-lb-fargate/NLBFargateService/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-ecs-integ-lb-fargate/NLBFargateService/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","name":"web","portMappings":[{"containerPort":80,"protocol":"tcp"}],"logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"NLBFargateServiceTaskDefwebLogGroupC4A42FE2"},"awslogs-stream-prefix":"NLBFargateService","awslogs-region":{"Ref":"AWS::Region"}}}}],"cpu":"512","executionRoleArn":{"Fn::GetAtt":["NLBFargateServiceTaskDefExecutionRoleF6D642D5","Arn"]},"family":"awsecsinteglbfargateNLBFargateServiceTaskDef1265FF34","memory":"1024","networkMode":"awsvpc","requiresCompatibilities":["FARGATE"],"taskRoleArn":{"Fn::GetAtt":["NLBFargateServiceTaskDefTaskRole6C88F40B","Arn"]}}}},"web":{"id":"web","path":"aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"LogGroup":{"id":"LogGroup","path":"aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/web/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/web/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/ExecutionRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-lb-fargate/NLBFargateService/TaskDef/ExecutionRole/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":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["NLBFargateServiceTaskDefwebLogGroupC4A42FE2","Arn"]}}],"Version":"2012-10-17"},"policyName":"NLBFargateServiceTaskDefExecutionRoleDefaultPolicy90080805","roles":[{"Ref":"NLBFargateServiceTaskDefExecutionRoleF6D642D5"}]}}}}}}}}},"Service":{"id":"Service","path":"aws-ecs-integ-lb-fargate/NLBFargateService/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateService","version":"0.0.0","metadata":["*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ-lb-fargate/NLBFargateService/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":"FargateCluster7CCD5F93"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50,"alarms":{"alarmNames":[],"enable":false,"rollback":false}},"enableEcsManagedTags":false,"healthCheckGracePeriodSeconds":60,"launchType":"FARGATE","loadBalancers":[{"targetGroupArn":{"Ref":"NLBFargateServiceLBPublicListenerECSGroupC469CAA2"},"containerName":"web","containerPort":80}],"networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"DISABLED","subnets":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}],"securityGroups":[{"Fn::GetAtt":["SecurityGroupServiceDE1E5E6A","GroupId"]}]}},"taskDefinition":{"Ref":"NLBFargateServiceTaskDefB836FA89"}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-lb-fargate/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-lb-fargate/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"l3FargateTest":{"id":"l3FargateTest","path":"l3FargateTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"l3FargateTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"l3FargateTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"l3FargateTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"l3FargateTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"l3FargateTest/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-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/aws-ecs-patterns-queue-grace-period.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/aws-ecs-patterns-queue-grace-period.assets.json
index 57363af7fa094..990c38b552ff5 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/aws-ecs-patterns-queue-grace-period.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/aws-ecs-patterns-queue-grace-period.assets.json
@@ -1,5 +1,5 @@
{
- "version": "41.0.0",
+ "version": "45.0.0",
"files": {
"0f9c9e48cfdbcd02f5d463ee0e48b75a6028c86ff4dbe64525f720e85524f39d": {
"displayName": "aws-ecs-patterns-queue-grace-period Template",
@@ -8,7 +8,7 @@
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-f01def4c": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
"objectKey": "0f9c9e48cfdbcd02f5d463ee0e48b75a6028c86ff4dbe64525f720e85524f39d.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
@@ -23,7 +23,7 @@
"directory": "asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-b26f3a33": {
"repositoryName": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}",
"imageTag": "205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-image-publishing-role-${AWS::AccountId}-${AWS::Region}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/cdk.out
index 188478b55560e..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"41.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/integ.json
index 174fc0a2deb78..63d080241fe2f 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "41.0.0",
+ "version": "45.0.0",
"testCases": {
"queueProcessingFargateServiceGracePeriodTest/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "queueProcessingFargateServiceGracePeriodTest/DefaultTest/DeployAssert",
"assertionStackName": "queueProcessingFargateServiceGracePeriodTestDefaultTestDeployAssert2CA06C1B"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/manifest.json
index 32aeec8710b78..70f7bef3c1e81 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "42.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-patterns-queue-grace-period.assets": {
"type": "cdk:asset-manifest",
@@ -862,7 +862,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
},
- "minimumCliVersion": "2.1006.0"
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/queueProcessingFargateServiceGracePeriodTestDefaultTestDeployAssert2CA06C1B.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/queueProcessingFargateServiceGracePeriodTestDefaultTestDeployAssert2CA06C1B.assets.json
index 324b6751cff40..66d1c81f6f031 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/queueProcessingFargateServiceGracePeriodTestDefaultTestDeployAssert2CA06C1B.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/queueProcessingFargateServiceGracePeriodTestDefaultTestDeployAssert2CA06C1B.assets.json
@@ -1,5 +1,5 @@
{
- "version": "41.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
"displayName": "queueProcessingFargateServiceGracePeriodTestDefaultTestDeployAssert2CA06C1B Template",
@@ -8,7 +8,7 @@
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/tree.json
index 8f770aa9c953e..3197b2165b88f 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-grace-period.js.snapshot/tree.json
@@ -1 +1 @@
-{"version":"tree-0.1","tree":{"id":"App","path":"","children":{"aws-ecs-patterns-queue-grace-period":{"id":"aws-ecs-patterns-queue-grace-period","path":"aws-ecs-patterns-queue-grace-period","children":{"VPC":{"id":"VPC","path":"aws-ecs-patterns-queue-grace-period/VPC","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/VPC/Resource","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-ecs-patterns-queue-grace-period/VPC"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPC","version":"0.0.0"}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet1","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet1/Subnet","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-ecs-patterns-queue-grace-period/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet1/RouteTable","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet1/RouteTableAssociation","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPublicSubnet1RouteTableFEE4B781"},"subnetId":{"Ref":"VPCPublicSubnet1SubnetB4246D30"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet1/DefaultRoute","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","gatewayId":{"Ref":"VPCIGWB7E252D3"},"routeTableId":{"Ref":"VPCPublicSubnet1RouteTableFEE4B781"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"}},"EIP":{"id":"EIP","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet1/EIP","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::EIP","aws:cdk:cloudformation:props":{"domain":"vpc","tags":[{"key":"Name","value":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet1"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet1/NATGateway","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-ecs-patterns-queue-grace-period/VPC/PublicSubnet1"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnNatGateway","version":"0.0.0"}}},"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":["*"]}]}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet2","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet2/Subnet","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-ecs-patterns-queue-grace-period/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet2/RouteTable","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet2/RouteTableAssociation","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPublicSubnet2RouteTable6F1A15F1"},"subnetId":{"Ref":"VPCPublicSubnet2Subnet74179F39"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet2/DefaultRoute","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","gatewayId":{"Ref":"VPCIGWB7E252D3"},"routeTableId":{"Ref":"VPCPublicSubnet2RouteTable6F1A15F1"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"}},"EIP":{"id":"EIP","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet2/EIP","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::EIP","aws:cdk:cloudformation:props":{"domain":"vpc","tags":[{"key":"Name","value":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet2"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet2/NATGateway","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-ecs-patterns-queue-grace-period/VPC/PublicSubnet2"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnNatGateway","version":"0.0.0"}}},"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":["*"]}]}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet1","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet1/Subnet","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-ecs-patterns-queue-grace-period/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet1/RouteTable","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet1/RouteTableAssociation","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPrivateSubnet1RouteTableBE8A6027"},"subnetId":{"Ref":"VPCPrivateSubnet1Subnet8BCA10E0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet1/DefaultRoute","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","natGatewayId":{"Ref":"VPCPublicSubnet1NATGatewayE0556630"},"routeTableId":{"Ref":"VPCPrivateSubnet1RouteTableBE8A6027"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"}}},"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":"*"},{}]}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet2","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet2/Subnet","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-ecs-patterns-queue-grace-period/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet2/RouteTable","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet2/RouteTableAssociation","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPrivateSubnet2RouteTable0A19E10E"},"subnetId":{"Ref":"VPCPrivateSubnet2SubnetCFCDAA7A"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet2/DefaultRoute","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","natGatewayId":{"Ref":"VPCPublicSubnet2NATGateway3C070193"},"routeTableId":{"Ref":"VPCPrivateSubnet2RouteTable0A19E10E"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"}}},"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":"*"},{}]}},"IGW":{"id":"IGW","path":"aws-ecs-patterns-queue-grace-period/VPC/IGW","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::InternetGateway","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-grace-period/VPC"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnInternetGateway","version":"0.0.0"}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-patterns-queue-grace-period/VPC/VPCGW","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPCGatewayAttachment","aws:cdk:cloudformation:props":{"internetGatewayId":{"Ref":"VPCIGWB7E252D3"},"vpcId":{"Ref":"VPCB9E5F0B4"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"restrictDefaultSecurityGroup":false,"maxAzs":"*"}]}},"QueueProcessingService":{"id":"QueueProcessingService","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService","children":{"EcsProcessingDeadLetterQueue":{"id":"EcsProcessingDeadLetterQueue","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/EcsProcessingDeadLetterQueue","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/EcsProcessingDeadLetterQueue/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::Queue","aws:cdk:cloudformation:props":{"messageRetentionPeriod":1209600}},"constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueue","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.Queue","version":"0.0.0","metadata":[{"retentionPeriod":"*"}]}},"EcsProcessingQueue":{"id":"EcsProcessingQueue","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/EcsProcessingQueue","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/EcsProcessingQueue/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::Queue","aws:cdk:cloudformation:props":{"redrivePolicy":{"deadLetterTargetArn":{"Fn::GetAtt":["QueueProcessingServiceEcsProcessingDeadLetterQueueD47A7C6B","Arn"]},"maxReceiveCount":3}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueue","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.Queue","version":"0.0.0","metadata":[{"visibilityTimeout":"*","deadLetterQueue":{"queue":"*","maxReceiveCount":"*"}}]}},"SQSDeadLetterQueue":{"id":"SQSDeadLetterQueue","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/SQSDeadLetterQueue","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSDeadLetterQueueArn":{"id":"SQSDeadLetterQueueArn","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/SQSDeadLetterQueueArn","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSQueue":{"id":"SQSQueue","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/SQSQueue","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSQueueArn":{"id":"SQSQueueArn","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/SQSQueueArn","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"QueueProcessingTaskDef":{"id":"QueueProcessingTaskDef","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef","children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/TaskRole","children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/TaskRole/Resource","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/TaskRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/TaskRole/DefaultPolicy/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["sqs:ChangeMessageVisibility","sqs:DeleteMessage","sqs:GetQueueAttributes","sqs:GetQueueUrl","sqs:ReceiveMessage"],"Effect":"Allow","Resource":{"Fn::GetAtt":["QueueProcessingServiceEcsProcessingQueue552F0B37","Arn"]}}],"Version":"2012-10-17"},"policyName":"QueueProcessingServiceQueueProcessingTaskDefTaskRoleDefaultPolicyAE808B19","roles":[{"Ref":"QueueProcessingServiceQueueProcessingTaskDefTaskRole782B79A6"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::TaskDefinition","aws:cdk:cloudformation:props":{"containerDefinitions":[{"essential":true,"image":{"Fn::Sub":"${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03"},"name":"QueueProcessingContainer","logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"QueueProcessingServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupCC92448A"},"awslogs-stream-prefix":"QueueProcessingService","awslogs-region":{"Ref":"AWS::Region"}}},"environment":[{"name":"QUEUE_NAME","value":{"Fn::GetAtt":["QueueProcessingServiceEcsProcessingQueue552F0B37","QueueName"]}}]}],"cpu":"256","executionRoleArn":{"Fn::GetAtt":["QueueProcessingServiceQueueProcessingTaskDefExecutionRole37838985","Arn"]},"family":"awsecspatternsqueuegraceperiodQueueProcessingServiceQueueProcessingTaskDefD9C591BD","memory":"512","networkMode":"awsvpc","requiresCompatibilities":["FARGATE"],"taskRoleArn":{"Fn::GetAtt":["QueueProcessingServiceQueueProcessingTaskDefTaskRole782B79A6","Arn"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnTaskDefinition","version":"0.0.0"}},"QueueProcessingContainer":{"id":"QueueProcessingContainer","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer","children":{"AssetImage":{"id":"AssetImage","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage","children":{"Staging":{"id":"Staging","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Repository":{"id":"Repository","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Repository","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr.RepositoryBase","version":"0.0.0","metadata":[]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecr_assets.DockerImageAsset","version":"0.0.0"}},"LogGroup":{"id":"LogGroup","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}},"constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole","children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/Resource","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Fn::Sub":"cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"}]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"},{"Action":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["QueueProcessingServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupCC92448A","Arn"]}}],"Version":"2012-10-17"},"policyName":"QueueProcessingServiceQueueProcessingTaskDefExecutionRoleDefaultPolicyA83D332D","roles":[{"Ref":"QueueProcessingServiceQueueProcessingTaskDefExecutionRole37838985"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateTaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]}},"QueueProcessingFargateService":{"id":"QueueProcessingFargateService","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService","children":{"Service":{"id":"Service","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/Service","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::Service","aws:cdk:cloudformation:props":{"cluster":{"Ref":"EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"healthCheckGracePeriodSeconds":120,"launchType":"FARGATE","networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"DISABLED","subnets":[{"Ref":"VPCPrivateSubnet1Subnet8BCA10E0"},{"Ref":"VPCPrivateSubnet2SubnetCFCDAA7A"}],"securityGroups":[{"Fn::GetAtt":["QueueProcessingServiceQueueProcessingFargateServiceSecurityGroup8FDF413D","GroupId"]}]}},"taskDefinition":{"Ref":"QueueProcessingServiceQueueProcessingTaskDef4982F68B"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnService","version":"0.0.0"}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/SecurityGroup","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/SecurityGroup/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroup","aws:cdk:cloudformation:props":{"groupDescription":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroup","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]}},"ScalingRole":{"id":"ScalingRole","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/ScalingRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"TaskCount":{"id":"TaskCount","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount","children":{"Target":{"id":"Target","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalableTarget","aws:cdk:cloudformation:props":{"maxCapacity":2,"minCapacity":0,"resourceId":{"Fn::Join":["",["service/",{"Ref":"EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"},"/",{"Fn::GetAtt":["QueueProcessingServiceQueueProcessingFargateService0340DB9F","Name"]}]]},"roleArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::",{"Ref":"AWS::AccountId"},":role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService"]]},"scalableDimension":"ecs:service:DesiredCount","serviceNamespace":"ecs"}},"constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalableTarget","version":"0.0.0"}},"CpuScaling":{"id":"CpuScaling","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/CpuScaling","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/CpuScaling/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueuegraceperiodQueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetCpuScaling7AF06382","policyType":"TargetTrackingScaling","scalingTargetId":{"Ref":"QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetA9D54444"},"targetTrackingScalingPolicyConfiguration":{"predefinedMetricSpecification":{"predefinedMetricType":"ECSServiceAverageCPUUtilization"},"targetValue":50}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.TargetTrackingScalingPolicy","version":"0.0.0"}},"QueueMessagesVisibleScaling":{"id":"QueueMessagesVisibleScaling","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling","children":{"LowerPolicy":{"id":"LowerPolicy","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueuegraceperiodQueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy9258A283","policyType":"StepScaling","scalingTargetId":{"Ref":"QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetA9D54444"},"stepScalingPolicyConfiguration":{"adjustmentType":"ChangeInCapacity","metricAggregationType":"Maximum","stepAdjustments":[{"metricIntervalUpperBound":0,"scalingAdjustment":-1}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingAction","version":"0.0.0"}},"LowerAlarm":{"id":"LowerAlarm","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::CloudWatch::Alarm","aws:cdk:cloudformation:props":{"alarmActions":[{"Ref":"QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy332E2644"}],"alarmDescription":"Lower threshold scaling alarm","comparisonOperator":"LessThanOrEqualToThreshold","dimensions":[{"name":"QueueName","value":{"Fn::GetAtt":["QueueProcessingServiceEcsProcessingQueue552F0B37","QueueName"]}}],"evaluationPeriods":1,"metricName":"ApproximateNumberOfMessagesVisible","namespace":"AWS/SQS","period":300,"statistic":"Maximum","threshold":0}},"constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.CfnAlarm","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.Alarm","version":"0.0.0","metadata":[{"metric":{"warnings":"*"},"alarmDescription":"*","comparisonOperator":"*","evaluationPeriods":"*","datapointsToAlarm":"*","threshold":"*"},{"addAlarmAction":[{}]}]}},"UpperPolicy":{"id":"UpperPolicy","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueuegraceperiodQueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicyF9F9770F","policyType":"StepScaling","scalingTargetId":{"Ref":"QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetA9D54444"},"stepScalingPolicyConfiguration":{"adjustmentType":"ChangeInCapacity","metricAggregationType":"Maximum","stepAdjustments":[{"metricIntervalLowerBound":0,"metricIntervalUpperBound":400,"scalingAdjustment":1},{"metricIntervalLowerBound":400,"scalingAdjustment":5}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingAction","version":"0.0.0"}},"UpperAlarm":{"id":"UpperAlarm","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::CloudWatch::Alarm","aws:cdk:cloudformation:props":{"alarmActions":[{"Ref":"QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy84DD739A"}],"alarmDescription":"Upper threshold scaling alarm","comparisonOperator":"GreaterThanOrEqualToThreshold","dimensions":[{"name":"QueueName","value":{"Fn::GetAtt":["QueueProcessingServiceEcsProcessingQueue552F0B37","QueueName"]}}],"evaluationPeriods":1,"metricName":"ApproximateNumberOfMessagesVisible","namespace":"AWS/SQS","period":300,"statistic":"Maximum","threshold":100}},"constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.CfnAlarm","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.Alarm","version":"0.0.0","metadata":[{"metric":{"warnings":"*"},"alarmDescription":"*","comparisonOperator":"*","evaluationPeriods":"*","datapointsToAlarm":"*","threshold":"*"},{"addAlarmAction":[{}]}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingPolicy","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.ScalableTarget","version":"0.0.0","metadata":[{"serviceNamespace":"ecs","scalableDimension":"*","resourceId":"*","role":"*","minCapacity":"*","maxCapacity":"*"},{"scaleToTrackMetric":["*",{"predefinedMetric":"*","policyName":"*","disableScaleIn":"*","targetValue":"*","scaleInCooldown":"*"}]},{"scaleOnMetric":["*",{"metric":{"warnings":"*"},"scalingSteps":[{"upper":"*","change":"*"},{"lower":"*","change":"*"},{"lower":"*","change":"*"}],"cooldown":"*"}]}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ScalableTaskCount","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateService","version":"0.0.0","metadata":["*"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.QueueProcessingFargateService","version":"0.0.0"}},"EcsDefaultClusterMnL3mNNYNVPC":{"id":"EcsDefaultClusterMnL3mNNYNVPC","path":"aws-ecs-patterns-queue-grace-period/EcsDefaultClusterMnL3mNNYNVPC","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/EcsDefaultClusterMnL3mNNYNVPC/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::Cluster","aws:cdk:cloudformation:props":{}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCluster","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"}]}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-patterns-queue-grace-period/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-patterns-queue-grace-period/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"}},"queueProcessingFargateServiceGracePeriodTest":{"id":"queueProcessingFargateServiceGracePeriodTest","path":"queueProcessingFargateServiceGracePeriodTest","children":{"DefaultTest":{"id":"DefaultTest","path":"queueProcessingFargateServiceGracePeriodTest/DefaultTest","children":{"Default":{"id":"Default","path":"queueProcessingFargateServiceGracePeriodTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"queueProcessingFargateServiceGracePeriodTest/DefaultTest/DeployAssert","children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"queueProcessingFargateServiceGracePeriodTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"queueProcessingFargateServiceGracePeriodTest/DefaultTest/DeployAssert/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"}},"Tree":{"id":"Tree","path":"Tree","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.0.0"}}}
\ 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":{"aws-ecs-patterns-queue-grace-period":{"id":"aws-ecs-patterns-queue-grace-period","path":"aws-ecs-patterns-queue-grace-period","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"VPC":{"id":"VPC","path":"aws-ecs-patterns-queue-grace-period/VPC","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"restrictDefaultSecurityGroup":false,"maxAzs":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/VPC"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/VPC/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/VPC/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-grace-period/VPC/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/VPC/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/VPC/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-grace-period/VPC/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/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-ecs-patterns-queue-grace-period/VPC"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-patterns-queue-grace-period/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"}}}}}},"QueueProcessingService":{"id":"QueueProcessingService","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.QueueProcessingFargateService","version":"0.0.0"},"children":{"EcsProcessingDeadLetterQueue":{"id":"EcsProcessingDeadLetterQueue","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/EcsProcessingDeadLetterQueue","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.Queue","version":"0.0.0","metadata":[{"retentionPeriod":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/EcsProcessingDeadLetterQueue/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueue","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::Queue","aws:cdk:cloudformation:props":{"messageRetentionPeriod":1209600}}}}},"EcsProcessingQueue":{"id":"EcsProcessingQueue","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/EcsProcessingQueue","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.Queue","version":"0.0.0","metadata":[{"visibilityTimeout":"*","deadLetterQueue":{"queue":"*","maxReceiveCount":"*"}}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/EcsProcessingQueue/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueue","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::Queue","aws:cdk:cloudformation:props":{"redrivePolicy":{"deadLetterTargetArn":{"Fn::GetAtt":["QueueProcessingServiceEcsProcessingDeadLetterQueueD47A7C6B","Arn"]},"maxReceiveCount":3}}}}}},"SQSDeadLetterQueue":{"id":"SQSDeadLetterQueue","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/SQSDeadLetterQueue","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSDeadLetterQueueArn":{"id":"SQSDeadLetterQueueArn","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/SQSDeadLetterQueueArn","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSQueue":{"id":"SQSQueue","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/SQSQueue","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSQueueArn":{"id":"SQSQueueArn","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/SQSQueueArn","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"QueueProcessingTaskDef":{"id":"QueueProcessingTaskDef","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateTaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/TaskRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/TaskRole/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":["sqs:ChangeMessageVisibility","sqs:DeleteMessage","sqs:GetQueueAttributes","sqs:GetQueueUrl","sqs:ReceiveMessage"],"Effect":"Allow","Resource":{"Fn::GetAtt":["QueueProcessingServiceEcsProcessingQueue552F0B37","Arn"]}}],"Version":"2012-10-17"},"policyName":"QueueProcessingServiceQueueProcessingTaskDefTaskRoleDefaultPolicyAE808B19","roles":[{"Ref":"QueueProcessingServiceQueueProcessingTaskDefTaskRole782B79A6"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/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":{"Fn::Sub":"${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03"},"name":"QueueProcessingContainer","logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"QueueProcessingServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupCC92448A"},"awslogs-stream-prefix":"QueueProcessingService","awslogs-region":{"Ref":"AWS::Region"}}},"environment":[{"name":"QUEUE_NAME","value":{"Fn::GetAtt":["QueueProcessingServiceEcsProcessingQueue552F0B37","QueueName"]}}]}],"cpu":"256","executionRoleArn":{"Fn::GetAtt":["QueueProcessingServiceQueueProcessingTaskDefExecutionRole37838985","Arn"]},"family":"awsecspatternsqueuegraceperiodQueueProcessingServiceQueueProcessingTaskDefD9C591BD","memory":"512","networkMode":"awsvpc","requiresCompatibilities":["FARGATE"],"taskRoleArn":{"Fn::GetAtt":["QueueProcessingServiceQueueProcessingTaskDefTaskRole782B79A6","Arn"]}}}},"QueueProcessingContainer":{"id":"QueueProcessingContainer","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"AssetImage":{"id":"AssetImage","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr_assets.DockerImageAsset","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Repository":{"id":"Repository","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Repository","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr.RepositoryBase","version":"0.0.0","metadata":[]}}}},"LogGroup":{"id":"LogGroup","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/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-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/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":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Fn::Sub":"cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"}]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"},{"Action":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["QueueProcessingServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupCC92448A","Arn"]}}],"Version":"2012-10-17"},"policyName":"QueueProcessingServiceQueueProcessingTaskDefExecutionRoleDefaultPolicyA83D332D","roles":[{"Ref":"QueueProcessingServiceQueueProcessingTaskDefExecutionRole37838985"}]}}}}}}}}},"QueueProcessingFargateService":{"id":"QueueProcessingFargateService","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateService","version":"0.0.0","metadata":["*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/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":"EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"healthCheckGracePeriodSeconds":120,"launchType":"FARGATE","networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"DISABLED","subnets":[{"Ref":"VPCPrivateSubnet1Subnet8BCA10E0"},{"Ref":"VPCPrivateSubnet2SubnetCFCDAA7A"}],"securityGroups":[{"Fn::GetAtt":["QueueProcessingServiceQueueProcessingFargateServiceSecurityGroup8FDF413D","GroupId"]}]}},"taskDefinition":{"Ref":"QueueProcessingServiceQueueProcessingTaskDef4982F68B"}}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/SecurityGroup/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-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"ScalingRole":{"id":"ScalingRole","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/ScalingRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"TaskCount":{"id":"TaskCount","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ScalableTaskCount","version":"0.0.0"},"children":{"Target":{"id":"Target","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.ScalableTarget","version":"0.0.0","metadata":[{"serviceNamespace":"ecs","scalableDimension":"*","resourceId":"*","role":"*","minCapacity":"*","maxCapacity":"*"},{"scaleToTrackMetric":["*",{"predefinedMetric":"*","policyName":"*","disableScaleIn":"*","targetValue":"*","scaleInCooldown":"*"}]},{"scaleOnMetric":["*",{"metric":{"warnings":"*"},"scalingSteps":[{"upper":"*","change":"*"},{"lower":"*","change":"*"},{"lower":"*","change":"*"}],"cooldown":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalableTarget","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalableTarget","aws:cdk:cloudformation:props":{"maxCapacity":2,"minCapacity":0,"resourceId":{"Fn::Join":["",["service/",{"Ref":"EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"},"/",{"Fn::GetAtt":["QueueProcessingServiceQueueProcessingFargateService0340DB9F","Name"]}]]},"roleArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::",{"Ref":"AWS::AccountId"},":role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService"]]},"scalableDimension":"ecs:service:DesiredCount","serviceNamespace":"ecs"}}},"CpuScaling":{"id":"CpuScaling","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/CpuScaling","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.TargetTrackingScalingPolicy","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/CpuScaling/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueuegraceperiodQueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetCpuScaling7AF06382","policyType":"TargetTrackingScaling","scalingTargetId":{"Ref":"QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetA9D54444"},"targetTrackingScalingPolicyConfiguration":{"predefinedMetricSpecification":{"predefinedMetricType":"ECSServiceAverageCPUUtilization"},"targetValue":50}}}}}},"QueueMessagesVisibleScaling":{"id":"QueueMessagesVisibleScaling","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingPolicy","version":"0.0.0"},"children":{"LowerPolicy":{"id":"LowerPolicy","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingAction","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueuegraceperiodQueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy9258A283","policyType":"StepScaling","scalingTargetId":{"Ref":"QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetA9D54444"},"stepScalingPolicyConfiguration":{"adjustmentType":"ChangeInCapacity","metricAggregationType":"Maximum","stepAdjustments":[{"metricIntervalUpperBound":0,"scalingAdjustment":-1}]}}}}}},"LowerAlarm":{"id":"LowerAlarm","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.Alarm","version":"0.0.0","metadata":[{"metric":{"warnings":"*"},"alarmDescription":"*","comparisonOperator":"*","evaluationPeriods":"*","datapointsToAlarm":"*","threshold":"*"},{"addAlarmAction":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.CfnAlarm","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CloudWatch::Alarm","aws:cdk:cloudformation:props":{"alarmActions":[{"Ref":"QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy332E2644"}],"alarmDescription":"Lower threshold scaling alarm","comparisonOperator":"LessThanOrEqualToThreshold","dimensions":[{"name":"QueueName","value":{"Fn::GetAtt":["QueueProcessingServiceEcsProcessingQueue552F0B37","QueueName"]}}],"evaluationPeriods":1,"metricName":"ApproximateNumberOfMessagesVisible","namespace":"AWS/SQS","period":300,"statistic":"Maximum","threshold":0}}}}},"UpperPolicy":{"id":"UpperPolicy","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingAction","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueuegraceperiodQueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicyF9F9770F","policyType":"StepScaling","scalingTargetId":{"Ref":"QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetA9D54444"},"stepScalingPolicyConfiguration":{"adjustmentType":"ChangeInCapacity","metricAggregationType":"Maximum","stepAdjustments":[{"metricIntervalLowerBound":0,"metricIntervalUpperBound":400,"scalingAdjustment":1},{"metricIntervalLowerBound":400,"scalingAdjustment":5}]}}}}}},"UpperAlarm":{"id":"UpperAlarm","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.Alarm","version":"0.0.0","metadata":[{"metric":{"warnings":"*"},"alarmDescription":"*","comparisonOperator":"*","evaluationPeriods":"*","datapointsToAlarm":"*","threshold":"*"},{"addAlarmAction":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.CfnAlarm","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CloudWatch::Alarm","aws:cdk:cloudformation:props":{"alarmActions":[{"Ref":"QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy84DD739A"}],"alarmDescription":"Upper threshold scaling alarm","comparisonOperator":"GreaterThanOrEqualToThreshold","dimensions":[{"name":"QueueName","value":{"Fn::GetAtt":["QueueProcessingServiceEcsProcessingQueue552F0B37","QueueName"]}}],"evaluationPeriods":1,"metricName":"ApproximateNumberOfMessagesVisible","namespace":"AWS/SQS","period":300,"statistic":"Maximum","threshold":100}}}}}}}}}}}}}}},"EcsDefaultClusterMnL3mNNYNVPC":{"id":"EcsDefaultClusterMnL3mNNYNVPC","path":"aws-ecs-patterns-queue-grace-period/EcsDefaultClusterMnL3mNNYNVPC","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-grace-period/EcsDefaultClusterMnL3mNNYNVPC/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":{}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-patterns-queue-grace-period/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-patterns-queue-grace-period/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"queueProcessingFargateServiceGracePeriodTest":{"id":"queueProcessingFargateServiceGracePeriodTest","path":"queueProcessingFargateServiceGracePeriodTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"queueProcessingFargateServiceGracePeriodTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"queueProcessingFargateServiceGracePeriodTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"queueProcessingFargateServiceGracePeriodTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"queueProcessingFargateServiceGracePeriodTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"queueProcessingFargateServiceGracePeriodTest/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-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/aws-ecs-patterns-queue-health-check.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/aws-ecs-patterns-queue-health-check.assets.json
index f62ad1e8b591e..e249006d1774c 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/aws-ecs-patterns-queue-health-check.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/aws-ecs-patterns-queue-health-check.assets.json
@@ -1,13 +1,14 @@
{
- "version": "35.0.0",
+ "version": "45.0.0",
"files": {
"4cd47558c35d37f22b4a35cb0e6f8da69d1ab1c18920d11e304d92e3a89167c5": {
+ "displayName": "aws-ecs-patterns-queue-health-check Template",
"source": {
"path": "aws-ecs-patterns-queue-health-check.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-36814eb9": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
"objectKey": "4cd47558c35d37f22b4a35cb0e6f8da69d1ab1c18920d11e304d92e3a89167c5.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
@@ -17,11 +18,12 @@
},
"dockerImages": {
"205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03": {
+ "displayName": "HealthCheckQueueService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage",
"source": {
"directory": "asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-b26f3a33": {
"repositoryName": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}",
"imageTag": "205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-image-publishing-role-${AWS::AccountId}-${AWS::Region}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/cdk.out
index c5cb2e5de6344..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"35.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/healthCheckQueueProcessingFargateServiceTestDefaultTestDeployAssert29ADF26E.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/healthCheckQueueProcessingFargateServiceTestDefaultTestDeployAssert29ADF26E.assets.json
index b6ded17501d5e..da5fc8bec14ed 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/healthCheckQueueProcessingFargateServiceTestDefaultTestDeployAssert29ADF26E.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/healthCheckQueueProcessingFargateServiceTestDefaultTestDeployAssert29ADF26E.assets.json
@@ -1,13 +1,14 @@
{
- "version": "35.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "healthCheckQueueProcessingFargateServiceTestDefaultTestDeployAssert29ADF26E Template",
"source": {
"path": "healthCheckQueueProcessingFargateServiceTestDefaultTestDeployAssert29ADF26E.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/integ.json
index 07b9f12d35588..a8995297a29d1 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "35.0.0",
+ "version": "45.0.0",
"testCases": {
"healthCheckQueueProcessingFargateServiceTest/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "healthCheckQueueProcessingFargateServiceTest/DefaultTest/DeployAssert",
"assertionStackName": "healthCheckQueueProcessingFargateServiceTestDefaultTestDeployAssert29ADF26E"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/manifest.json
index ebdb23310550c..f23bf31597590 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "35.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-patterns-queue-health-check.assets": {
"type": "cdk:asset-manifest",
@@ -34,12 +34,56 @@
"aws-ecs-patterns-queue-health-check.assets"
],
"metadata": {
+ "/aws-ecs-patterns-queue-health-check/VPC": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "restrictDefaultSecurityGroup": false
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/VPC/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "VPCB9E5F0B4"
}
],
+ "/aws-ecs-patterns-queue-health-check/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": [
+ "*"
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/VPC/PublicSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -76,6 +120,42 @@
"data": "VPCPublicSubnet1NATGatewayE0556630"
}
],
+ "/aws-ecs-patterns-queue-health-check/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": [
+ "*"
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/VPC/PublicSubnet2/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -112,6 +192,34 @@
"data": "VPCPublicSubnet2NATGateway3C070193"
}
],
+ "/aws-ecs-patterns-queue-health-check/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": {}
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -136,6 +244,34 @@
"data": "VPCPrivateSubnet1DefaultRouteAE1D6490"
}
],
+ "/aws-ecs-patterns-queue-health-check/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": {}
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet2/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -172,12 +308,32 @@
"data": "VPCVPCGW99B986DC"
}
],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/EcsProcessingDeadLetterQueue": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "retentionPeriod": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/EcsProcessingDeadLetterQueue/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "HealthCheckQueueServiceEcsProcessingDeadLetterQueueE3547724"
}
],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/EcsProcessingQueue": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "visibilityTimeout": "*",
+ "deadLetterQueue": {
+ "queue": "*",
+ "maxReceiveCount": "*"
+ }
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/EcsProcessingQueue/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -208,12 +364,105 @@
"data": "HealthCheckQueueServiceSQSQueueArnB4A71095"
}
],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ }
+ ],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/TaskRole": [
+ {
+ "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": [
+ "*"
+ ]
+ }
+ }
+ ],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/TaskRole/ImportTaskRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/TaskRole/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "HealthCheckQueueServiceQueueProcessingTaskDefTaskRole75C9B3DF"
}
],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/TaskRole/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": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/TaskRole/DefaultPolicy/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -226,36 +475,228 @@
"data": "HealthCheckQueueServiceQueueProcessingTaskDefE2DEF18C"
}
],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "retention": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "HealthCheckQueueServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupA6BFC460"
}
],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/ExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "assumedBy": {
+ "principalAccount": "*",
+ "assumeRoleAction": "*"
+ },
+ "roleName": "*"
+ }
+ },
+ {
+ "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": [
+ {}
+ ]
+ }
+ }
+ ],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/ExecutionRole/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "HealthCheckQueueServiceQueueProcessingTaskDefExecutionRole90BAC61F"
}
],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/ExecutionRole/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": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "HealthCheckQueueServiceQueueProcessingTaskDefExecutionRoleDefaultPolicy7AC42DD5"
}
],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService": [
+ {
+ "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": "*"
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/Service": [
{
"type": "aws:cdk:logicalId",
"data": "HealthCheckQueueServiceQueueProcessingFargateService3FF69405"
}
],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/SecurityGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/SecurityGroup/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "HealthCheckQueueServiceQueueProcessingFargateServiceSecurityGroupC3F38AFD"
}
],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/ScalingRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "serviceNamespace": "ecs",
+ "scalableDimension": "*",
+ "resourceId": "*",
+ "role": "*",
+ "minCapacity": "*",
+ "maxCapacity": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "scaleToTrackMetric": [
+ "*",
+ {
+ "predefinedMetric": "*",
+ "policyName": "*",
+ "disableScaleIn": "*",
+ "targetValue": "*",
+ "scaleInCooldown": "*"
+ }
+ ]
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "scaleOnMetric": [
+ "*",
+ {
+ "metric": {
+ "warnings": "*"
+ },
+ "scalingSteps": [
+ {
+ "upper": "*",
+ "change": "*"
+ },
+ {
+ "lower": "*",
+ "change": "*"
+ },
+ {
+ "lower": "*",
+ "change": "*"
+ }
+ ],
+ "cooldown": "*"
+ }
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -274,6 +715,29 @@
"data": "HealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy350CBF9F"
}
],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "metric": {
+ "warnings": "*"
+ },
+ "alarmDescription": "*",
+ "comparisonOperator": "*",
+ "evaluationPeriods": "*",
+ "datapointsToAlarm": "*",
+ "threshold": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addAlarmAction": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -286,12 +750,43 @@
"data": "HealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicyAABD0785"
}
],
+ "/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "metric": {
+ "warnings": "*"
+ },
+ "alarmDescription": "*",
+ "comparisonOperator": "*",
+ "evaluationPeriods": "*",
+ "datapointsToAlarm": "*",
+ "threshold": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addAlarmAction": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "HealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperAlarm0ADEAC2A"
}
],
+ "/aws-ecs-patterns-queue-health-check/EcsDefaultClusterMnL3mNNYNVPC": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-health-check/EcsDefaultClusterMnL3mNNYNVPC/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -366,6 +861,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/tree.json
index 348fa94324116..d969609dcba61 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-health-check.js.snapshot/tree.json
@@ -1,1617 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-patterns-queue-health-check": {
- "id": "aws-ecs-patterns-queue-health-check",
- "path": "aws-ecs-patterns-queue-health-check",
- "children": {
- "VPC": {
- "id": "VPC",
- "path": "aws-ecs-patterns-queue-health-check/VPC",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/VPC/Resource",
- "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-ecs-patterns-queue-health-check/VPC"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet1/Subnet",
- "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-ecs-patterns-queue-health-check/VPC/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPublicSubnet1RouteTableFEE4B781"
- },
- "subnetId": {
- "Ref": "VPCPublicSubnet1SubnetB4246D30"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "routeTableId": {
- "Ref": "VPCPublicSubnet1RouteTableFEE4B781"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet1/NATGateway",
- "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-ecs-patterns-queue-health-check/VPC/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
- "version": "0.0.0"
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet2/Subnet",
- "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-ecs-patterns-queue-health-check/VPC/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPublicSubnet2RouteTable6F1A15F1"
- },
- "subnetId": {
- "Ref": "VPCPublicSubnet2Subnet74179F39"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "routeTableId": {
- "Ref": "VPCPublicSubnet2RouteTable6F1A15F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PublicSubnet2/NATGateway",
- "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-ecs-patterns-queue-health-check/VPC/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
- "version": "0.0.0"
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet1/Subnet",
- "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-ecs-patterns-queue-health-check/VPC/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPrivateSubnet1RouteTableBE8A6027"
- },
- "subnetId": {
- "Ref": "VPCPrivateSubnet1Subnet8BCA10E0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VPCPublicSubnet1NATGatewayE0556630"
- },
- "routeTableId": {
- "Ref": "VPCPrivateSubnet1RouteTableBE8A6027"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
- "version": "0.0.0"
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet2/Subnet",
- "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-ecs-patterns-queue-health-check/VPC/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPrivateSubnet2RouteTable0A19E10E"
- },
- "subnetId": {
- "Ref": "VPCPrivateSubnet2SubnetCFCDAA7A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VPCPublicSubnet2NATGateway3C070193"
- },
- "routeTableId": {
- "Ref": "VPCPrivateSubnet2RouteTable0A19E10E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
- "version": "0.0.0"
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-patterns-queue-health-check/VPC/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-health-check/VPC"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-patterns-queue-health-check/VPC/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0"
- }
- },
- "HealthCheckQueueService": {
- "id": "HealthCheckQueueService",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService",
- "children": {
- "EcsProcessingDeadLetterQueue": {
- "id": "EcsProcessingDeadLetterQueue",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/EcsProcessingDeadLetterQueue",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/EcsProcessingDeadLetterQueue/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SQS::Queue",
- "aws:cdk:cloudformation:props": {
- "messageRetentionPeriod": 1209600
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.CfnQueue",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.Queue",
- "version": "0.0.0"
- }
- },
- "EcsProcessingQueue": {
- "id": "EcsProcessingQueue",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/EcsProcessingQueue",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/EcsProcessingQueue/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SQS::Queue",
- "aws:cdk:cloudformation:props": {
- "redrivePolicy": {
- "deadLetterTargetArn": {
- "Fn::GetAtt": [
- "HealthCheckQueueServiceEcsProcessingDeadLetterQueueE3547724",
- "Arn"
- ]
- },
- "maxReceiveCount": 3
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.CfnQueue",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.Queue",
- "version": "0.0.0"
- }
- },
- "SQSDeadLetterQueue": {
- "id": "SQSDeadLetterQueue",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/SQSDeadLetterQueue",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "SQSDeadLetterQueueArn": {
- "id": "SQSDeadLetterQueueArn",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/SQSDeadLetterQueueArn",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "SQSQueue": {
- "id": "SQSQueue",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/SQSQueue",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "SQSQueueArn": {
- "id": "SQSQueueArn",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/SQSQueueArn",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "QueueProcessingTaskDef": {
- "id": "QueueProcessingTaskDef",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/TaskRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/TaskRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "sqs:ChangeMessageVisibility",
- "sqs:DeleteMessage",
- "sqs:GetQueueAttributes",
- "sqs:GetQueueUrl",
- "sqs:ReceiveMessage"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "HealthCheckQueueServiceEcsProcessingQueue2FE4AB4D",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "HealthCheckQueueServiceQueueProcessingTaskDefTaskRoleDefaultPolicyDE6F15AA",
- "roles": [
- {
- "Ref": "HealthCheckQueueServiceQueueProcessingTaskDefTaskRole75C9B3DF"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": {
- "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03"
- },
- "name": "QueueProcessingContainer",
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": {
- "Ref": "HealthCheckQueueServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupA6BFC460"
- },
- "awslogs-stream-prefix": "HealthCheckQueueService",
- "awslogs-region": {
- "Ref": "AWS::Region"
- }
- }
- },
- "environment": [
- {
- "name": "QUEUE_NAME",
- "value": {
- "Fn::GetAtt": [
- "HealthCheckQueueServiceEcsProcessingQueue2FE4AB4D",
- "QueueName"
- ]
- }
- }
- ],
- "healthCheck": {
- "command": [
- "CMD-SHELL",
- "cat /tmp/health_status | grep -q \"1\" || exit 1"
- ],
- "interval": 10,
- "retries": 10,
- "timeout": 5
- }
- }
- ],
- "cpu": "256",
- "executionRoleArn": {
- "Fn::GetAtt": [
- "HealthCheckQueueServiceQueueProcessingTaskDefExecutionRole90BAC61F",
- "Arn"
- ]
- },
- "family": "awsecspatternsqueuehealthcheckHealthCheckQueueServiceQueueProcessingTaskDef531E773A",
- "memory": "512",
- "networkMode": "awsvpc",
- "requiresCompatibilities": [
- "FARGATE"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "HealthCheckQueueServiceQueueProcessingTaskDefTaskRole75C9B3DF",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "QueueProcessingContainer": {
- "id": "QueueProcessingContainer",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/QueueProcessingContainer",
- "children": {
- "AssetImage": {
- "id": "AssetImage",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage",
- "children": {
- "Staging": {
- "id": "Staging",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Staging",
- "constructInfo": {
- "fqn": "aws-cdk-lib.AssetStaging",
- "version": "0.0.0"
- }
- },
- "Repository": {
- "id": "Repository",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Repository",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset",
- "version": "0.0.0"
- }
- },
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "ecr:BatchCheckLayerAvailability",
- "ecr:BatchGetImage",
- "ecr:GetDownloadUrlForLayer"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecr:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":repository/",
- {
- "Fn::Sub": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"
- }
- ]
- ]
- }
- },
- {
- "Action": "ecr:GetAuthorizationToken",
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "HealthCheckQueueServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupA6BFC460",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "HealthCheckQueueServiceQueueProcessingTaskDefExecutionRoleDefaultPolicy7AC42DD5",
- "roles": [
- {
- "Ref": "HealthCheckQueueServiceQueueProcessingTaskDefExecutionRole90BAC61F"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.FargateTaskDefinition",
- "version": "0.0.0"
- }
- },
- "QueueProcessingFargateService": {
- "id": "QueueProcessingFargateService",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50,
- "alarms": {
- "alarmNames": [],
- "enable": false,
- "rollback": false
- }
- },
- "enableEcsManagedTags": false,
- "launchType": "FARGATE",
- "networkConfiguration": {
- "awsvpcConfiguration": {
- "assignPublicIp": "ENABLED",
- "subnets": [
- {
- "Ref": "VPCPublicSubnet1SubnetB4246D30"
- },
- {
- "Ref": "VPCPublicSubnet2Subnet74179F39"
- }
- ],
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "HealthCheckQueueServiceQueueProcessingFargateServiceSecurityGroupC3F38AFD",
- "GroupId"
- ]
- }
- ]
- }
- },
- "taskDefinition": {
- "Ref": "HealthCheckQueueServiceQueueProcessingTaskDefE2DEF18C"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/SecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0"
- }
- },
- "ScalingRole": {
- "id": "ScalingRole",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/ScalingRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "TaskCount": {
- "id": "TaskCount",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount",
- "children": {
- "Target": {
- "id": "Target",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ApplicationAutoScaling::ScalableTarget",
- "aws:cdk:cloudformation:props": {
- "maxCapacity": 2,
- "minCapacity": 1,
- "resourceId": {
- "Fn::Join": [
- "",
- [
- "service/",
- {
- "Ref": "EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"
- },
- "/",
- {
- "Fn::GetAtt": [
- "HealthCheckQueueServiceQueueProcessingFargateService3FF69405",
- "Name"
- ]
- }
- ]
- ]
- },
- "roleArn": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":iam::",
- {
- "Ref": "AWS::AccountId"
- },
- ":role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService"
- ]
- ]
- },
- "scalableDimension": "ecs:service:DesiredCount",
- "serviceNamespace": "ecs"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.CfnScalableTarget",
- "version": "0.0.0"
- }
- },
- "CpuScaling": {
- "id": "CpuScaling",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/CpuScaling",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/CpuScaling/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ApplicationAutoScaling::ScalingPolicy",
- "aws:cdk:cloudformation:props": {
- "policyName": "awsecspatternsqueuehealthcheckHealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTargetCpuScalingAE7C2661",
- "policyType": "TargetTrackingScaling",
- "scalingTargetId": {
- "Ref": "HealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTarget1FE1D4C0"
- },
- "targetTrackingScalingPolicyConfiguration": {
- "predefinedMetricSpecification": {
- "predefinedMetricType": "ECSServiceAverageCPUUtilization"
- },
- "targetValue": 50
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.TargetTrackingScalingPolicy",
- "version": "0.0.0"
- }
- },
- "QueueMessagesVisibleScaling": {
- "id": "QueueMessagesVisibleScaling",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling",
- "children": {
- "LowerPolicy": {
- "id": "LowerPolicy",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ApplicationAutoScaling::ScalingPolicy",
- "aws:cdk:cloudformation:props": {
- "policyName": "awsecspatternsqueuehealthcheckHealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicyB2D7C3E7",
- "policyType": "StepScaling",
- "scalingTargetId": {
- "Ref": "HealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTarget1FE1D4C0"
- },
- "stepScalingPolicyConfiguration": {
- "adjustmentType": "ChangeInCapacity",
- "metricAggregationType": "Maximum",
- "stepAdjustments": [
- {
- "metricIntervalUpperBound": 0,
- "scalingAdjustment": -1
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.StepScalingAction",
- "version": "0.0.0"
- }
- },
- "LowerAlarm": {
- "id": "LowerAlarm",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::CloudWatch::Alarm",
- "aws:cdk:cloudformation:props": {
- "alarmActions": [
- {
- "Ref": "HealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy350CBF9F"
- }
- ],
- "alarmDescription": "Lower threshold scaling alarm",
- "comparisonOperator": "LessThanOrEqualToThreshold",
- "dimensions": [
- {
- "name": "QueueName",
- "value": {
- "Fn::GetAtt": [
- "HealthCheckQueueServiceEcsProcessingQueue2FE4AB4D",
- "QueueName"
- ]
- }
- }
- ],
- "evaluationPeriods": 1,
- "metricName": "ApproximateNumberOfMessagesVisible",
- "namespace": "AWS/SQS",
- "period": 300,
- "statistic": "Maximum",
- "threshold": 0
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.CfnAlarm",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.Alarm",
- "version": "0.0.0"
- }
- },
- "UpperPolicy": {
- "id": "UpperPolicy",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ApplicationAutoScaling::ScalingPolicy",
- "aws:cdk:cloudformation:props": {
- "policyName": "awsecspatternsqueuehealthcheckHealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy953F3B85",
- "policyType": "StepScaling",
- "scalingTargetId": {
- "Ref": "HealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTarget1FE1D4C0"
- },
- "stepScalingPolicyConfiguration": {
- "adjustmentType": "ChangeInCapacity",
- "metricAggregationType": "Maximum",
- "stepAdjustments": [
- {
- "metricIntervalLowerBound": 0,
- "metricIntervalUpperBound": 400,
- "scalingAdjustment": 1
- },
- {
- "metricIntervalLowerBound": 400,
- "scalingAdjustment": 5
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.StepScalingAction",
- "version": "0.0.0"
- }
- },
- "UpperAlarm": {
- "id": "UpperAlarm",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::CloudWatch::Alarm",
- "aws:cdk:cloudformation:props": {
- "alarmActions": [
- {
- "Ref": "HealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicyAABD0785"
- }
- ],
- "alarmDescription": "Upper threshold scaling alarm",
- "comparisonOperator": "GreaterThanOrEqualToThreshold",
- "dimensions": [
- {
- "name": "QueueName",
- "value": {
- "Fn::GetAtt": [
- "HealthCheckQueueServiceEcsProcessingQueue2FE4AB4D",
- "QueueName"
- ]
- }
- }
- ],
- "evaluationPeriods": 1,
- "metricName": "ApproximateNumberOfMessagesVisible",
- "namespace": "AWS/SQS",
- "period": 300,
- "statistic": "Maximum",
- "threshold": 100
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.CfnAlarm",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.Alarm",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.StepScalingPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.ScalableTarget",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ScalableTaskCount",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.FargateService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs_patterns.QueueProcessingFargateService",
- "version": "0.0.0"
- }
- },
- "EcsDefaultClusterMnL3mNNYNVPC": {
- "id": "EcsDefaultClusterMnL3mNNYNVPC",
- "path": "aws-ecs-patterns-queue-health-check/EcsDefaultClusterMnL3mNNYNVPC",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-health-check/EcsDefaultClusterMnL3mNNYNVPC/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-patterns-queue-health-check/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-patterns-queue-health-check/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "healthCheckQueueProcessingFargateServiceTest": {
- "id": "healthCheckQueueProcessingFargateServiceTest",
- "path": "healthCheckQueueProcessingFargateServiceTest",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "healthCheckQueueProcessingFargateServiceTest/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "healthCheckQueueProcessingFargateServiceTest/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.3.0"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "healthCheckQueueProcessingFargateServiceTest/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "healthCheckQueueProcessingFargateServiceTest/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "healthCheckQueueProcessingFargateServiceTest/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.3.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-patterns-queue-health-check":{"id":"aws-ecs-patterns-queue-health-check","path":"aws-ecs-patterns-queue-health-check","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"VPC":{"id":"VPC","path":"aws-ecs-patterns-queue-health-check/VPC","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/VPC"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-health-check/VPC/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/VPC/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/VPC/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-health-check/VPC/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/VPC/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/VPC/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-health-check/VPC/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/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-ecs-patterns-queue-health-check/VPC"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-patterns-queue-health-check/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"}}}}}},"HealthCheckQueueService":{"id":"HealthCheckQueueService","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.QueueProcessingFargateService","version":"0.0.0"},"children":{"EcsProcessingDeadLetterQueue":{"id":"EcsProcessingDeadLetterQueue","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/EcsProcessingDeadLetterQueue","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.Queue","version":"0.0.0","metadata":[{"retentionPeriod":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/EcsProcessingDeadLetterQueue/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueue","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::Queue","aws:cdk:cloudformation:props":{"messageRetentionPeriod":1209600}}}}},"EcsProcessingQueue":{"id":"EcsProcessingQueue","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/EcsProcessingQueue","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.Queue","version":"0.0.0","metadata":[{"visibilityTimeout":"*","deadLetterQueue":{"queue":"*","maxReceiveCount":"*"}}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/EcsProcessingQueue/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueue","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::Queue","aws:cdk:cloudformation:props":{"redrivePolicy":{"deadLetterTargetArn":{"Fn::GetAtt":["HealthCheckQueueServiceEcsProcessingDeadLetterQueueE3547724","Arn"]},"maxReceiveCount":3}}}}}},"SQSDeadLetterQueue":{"id":"SQSDeadLetterQueue","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/SQSDeadLetterQueue","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSDeadLetterQueueArn":{"id":"SQSDeadLetterQueueArn","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/SQSDeadLetterQueueArn","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSQueue":{"id":"SQSQueue","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/SQSQueue","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSQueueArn":{"id":"SQSQueueArn","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/SQSQueueArn","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"QueueProcessingTaskDef":{"id":"QueueProcessingTaskDef","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateTaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/TaskRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/TaskRole/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":["sqs:ChangeMessageVisibility","sqs:DeleteMessage","sqs:GetQueueAttributes","sqs:GetQueueUrl","sqs:ReceiveMessage"],"Effect":"Allow","Resource":{"Fn::GetAtt":["HealthCheckQueueServiceEcsProcessingQueue2FE4AB4D","Arn"]}}],"Version":"2012-10-17"},"policyName":"HealthCheckQueueServiceQueueProcessingTaskDefTaskRoleDefaultPolicyDE6F15AA","roles":[{"Ref":"HealthCheckQueueServiceQueueProcessingTaskDefTaskRole75C9B3DF"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/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":{"Fn::Sub":"${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03"},"name":"QueueProcessingContainer","logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"HealthCheckQueueServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupA6BFC460"},"awslogs-stream-prefix":"HealthCheckQueueService","awslogs-region":{"Ref":"AWS::Region"}}},"environment":[{"name":"QUEUE_NAME","value":{"Fn::GetAtt":["HealthCheckQueueServiceEcsProcessingQueue2FE4AB4D","QueueName"]}}],"healthCheck":{"command":["CMD-SHELL","cat /tmp/health_status | grep -q \"1\" || exit 1"],"interval":10,"retries":10,"timeout":5}}],"cpu":"256","executionRoleArn":{"Fn::GetAtt":["HealthCheckQueueServiceQueueProcessingTaskDefExecutionRole90BAC61F","Arn"]},"family":"awsecspatternsqueuehealthcheckHealthCheckQueueServiceQueueProcessingTaskDef531E773A","memory":"512","networkMode":"awsvpc","requiresCompatibilities":["FARGATE"],"taskRoleArn":{"Fn::GetAtt":["HealthCheckQueueServiceQueueProcessingTaskDefTaskRole75C9B3DF","Arn"]}}}},"QueueProcessingContainer":{"id":"QueueProcessingContainer","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/QueueProcessingContainer","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"AssetImage":{"id":"AssetImage","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr_assets.DockerImageAsset","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Repository":{"id":"Repository","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Repository","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr.RepositoryBase","version":"0.0.0","metadata":[]}}}},"LogGroup":{"id":"LogGroup","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/ExecutionRole/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-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingTaskDef/ExecutionRole/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":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Fn::Sub":"cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"}]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"},{"Action":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["HealthCheckQueueServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupA6BFC460","Arn"]}}],"Version":"2012-10-17"},"policyName":"HealthCheckQueueServiceQueueProcessingTaskDefExecutionRoleDefaultPolicy7AC42DD5","roles":[{"Ref":"HealthCheckQueueServiceQueueProcessingTaskDefExecutionRole90BAC61F"}]}}}}}}}}},"QueueProcessingFargateService":{"id":"QueueProcessingFargateService","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateService","version":"0.0.0","metadata":["*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/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":"EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50,"alarms":{"alarmNames":[],"enable":false,"rollback":false}},"enableEcsManagedTags":false,"launchType":"FARGATE","networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"ENABLED","subnets":[{"Ref":"VPCPublicSubnet1SubnetB4246D30"},{"Ref":"VPCPublicSubnet2Subnet74179F39"}],"securityGroups":[{"Fn::GetAtt":["HealthCheckQueueServiceQueueProcessingFargateServiceSecurityGroupC3F38AFD","GroupId"]}]}},"taskDefinition":{"Ref":"HealthCheckQueueServiceQueueProcessingTaskDefE2DEF18C"}}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/SecurityGroup/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-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"ScalingRole":{"id":"ScalingRole","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/ScalingRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"TaskCount":{"id":"TaskCount","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ScalableTaskCount","version":"0.0.0"},"children":{"Target":{"id":"Target","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.ScalableTarget","version":"0.0.0","metadata":[{"serviceNamespace":"ecs","scalableDimension":"*","resourceId":"*","role":"*","minCapacity":"*","maxCapacity":"*"},{"scaleToTrackMetric":["*",{"predefinedMetric":"*","policyName":"*","disableScaleIn":"*","targetValue":"*","scaleInCooldown":"*"}]},{"scaleOnMetric":["*",{"metric":{"warnings":"*"},"scalingSteps":[{"upper":"*","change":"*"},{"lower":"*","change":"*"},{"lower":"*","change":"*"}],"cooldown":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalableTarget","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalableTarget","aws:cdk:cloudformation:props":{"maxCapacity":2,"minCapacity":1,"resourceId":{"Fn::Join":["",["service/",{"Ref":"EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"},"/",{"Fn::GetAtt":["HealthCheckQueueServiceQueueProcessingFargateService3FF69405","Name"]}]]},"roleArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::",{"Ref":"AWS::AccountId"},":role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService"]]},"scalableDimension":"ecs:service:DesiredCount","serviceNamespace":"ecs"}}},"CpuScaling":{"id":"CpuScaling","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/CpuScaling","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.TargetTrackingScalingPolicy","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/CpuScaling/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueuehealthcheckHealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTargetCpuScalingAE7C2661","policyType":"TargetTrackingScaling","scalingTargetId":{"Ref":"HealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTarget1FE1D4C0"},"targetTrackingScalingPolicyConfiguration":{"predefinedMetricSpecification":{"predefinedMetricType":"ECSServiceAverageCPUUtilization"},"targetValue":50}}}}}},"QueueMessagesVisibleScaling":{"id":"QueueMessagesVisibleScaling","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingPolicy","version":"0.0.0"},"children":{"LowerPolicy":{"id":"LowerPolicy","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingAction","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueuehealthcheckHealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicyB2D7C3E7","policyType":"StepScaling","scalingTargetId":{"Ref":"HealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTarget1FE1D4C0"},"stepScalingPolicyConfiguration":{"adjustmentType":"ChangeInCapacity","metricAggregationType":"Maximum","stepAdjustments":[{"metricIntervalUpperBound":0,"scalingAdjustment":-1}]}}}}}},"LowerAlarm":{"id":"LowerAlarm","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.Alarm","version":"0.0.0","metadata":[{"metric":{"warnings":"*"},"alarmDescription":"*","comparisonOperator":"*","evaluationPeriods":"*","datapointsToAlarm":"*","threshold":"*"},{"addAlarmAction":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.CfnAlarm","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CloudWatch::Alarm","aws:cdk:cloudformation:props":{"alarmActions":[{"Ref":"HealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy350CBF9F"}],"alarmDescription":"Lower threshold scaling alarm","comparisonOperator":"LessThanOrEqualToThreshold","dimensions":[{"name":"QueueName","value":{"Fn::GetAtt":["HealthCheckQueueServiceEcsProcessingQueue2FE4AB4D","QueueName"]}}],"evaluationPeriods":1,"metricName":"ApproximateNumberOfMessagesVisible","namespace":"AWS/SQS","period":300,"statistic":"Maximum","threshold":0}}}}},"UpperPolicy":{"id":"UpperPolicy","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingAction","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueuehealthcheckHealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy953F3B85","policyType":"StepScaling","scalingTargetId":{"Ref":"HealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTarget1FE1D4C0"},"stepScalingPolicyConfiguration":{"adjustmentType":"ChangeInCapacity","metricAggregationType":"Maximum","stepAdjustments":[{"metricIntervalLowerBound":0,"metricIntervalUpperBound":400,"scalingAdjustment":1},{"metricIntervalLowerBound":400,"scalingAdjustment":5}]}}}}}},"UpperAlarm":{"id":"UpperAlarm","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.Alarm","version":"0.0.0","metadata":[{"metric":{"warnings":"*"},"alarmDescription":"*","comparisonOperator":"*","evaluationPeriods":"*","datapointsToAlarm":"*","threshold":"*"},{"addAlarmAction":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/HealthCheckQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.CfnAlarm","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CloudWatch::Alarm","aws:cdk:cloudformation:props":{"alarmActions":[{"Ref":"HealthCheckQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicyAABD0785"}],"alarmDescription":"Upper threshold scaling alarm","comparisonOperator":"GreaterThanOrEqualToThreshold","dimensions":[{"name":"QueueName","value":{"Fn::GetAtt":["HealthCheckQueueServiceEcsProcessingQueue2FE4AB4D","QueueName"]}}],"evaluationPeriods":1,"metricName":"ApproximateNumberOfMessagesVisible","namespace":"AWS/SQS","period":300,"statistic":"Maximum","threshold":100}}}}}}}}}}}}}}},"EcsDefaultClusterMnL3mNNYNVPC":{"id":"EcsDefaultClusterMnL3mNNYNVPC","path":"aws-ecs-patterns-queue-health-check/EcsDefaultClusterMnL3mNNYNVPC","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-health-check/EcsDefaultClusterMnL3mNNYNVPC/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":{}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-patterns-queue-health-check/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-patterns-queue-health-check/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"healthCheckQueueProcessingFargateServiceTest":{"id":"healthCheckQueueProcessingFargateServiceTest","path":"healthCheckQueueProcessingFargateServiceTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"healthCheckQueueProcessingFargateServiceTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"healthCheckQueueProcessingFargateServiceTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"healthCheckQueueProcessingFargateServiceTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"healthCheckQueueProcessingFargateServiceTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"healthCheckQueueProcessingFargateServiceTest/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-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03/Dockerfile b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03/Dockerfile
new file mode 100644
index 0000000000000..030d33bfed21f
--- /dev/null
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03/Dockerfile
@@ -0,0 +1,11 @@
+FROM public.ecr.aws/lambda/python:3.11
+
+RUN pip3 install boto3
+
+ENV QUEUE_NAME $QUEUE_NAME
+ENV PYTHONUNBUFFERED=1
+
+WORKDIR /src
+ADD . /src
+
+ENTRYPOINT [ "python3", "index.py"]
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03/index.py b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03/index.py
new file mode 100644
index 0000000000000..e1bddd6e8d3ff
--- /dev/null
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03/index.py
@@ -0,0 +1,32 @@
+#!/usr/bin/python
+import os
+import boto3
+
+QUEUE_NAME = os.environ.get('QUEUE_NAME')
+print('QUEUE_NAME ' + QUEUE_NAME)
+
+if __name__ == '__main__':
+ try:
+ client = boto3.client('sqs')
+ queue_url = client.get_queue_url(QueueName=QUEUE_NAME)['QueueUrl']
+ print('queue_url ' + queue_url)
+ while True:
+ response = client.receive_message(
+ QueueUrl=queue_url,
+ WaitTimeSeconds=10,
+ )
+ if response and 'Messages' in response:
+ for msg in response['Messages']:
+ print(msg['Body'])
+ entries = [{'Id': x['MessageId'], 'ReceiptHandle': x['ReceiptHandle']} for x in response['Messages']]
+ client.delete_message_batch(QueueUrl=queue_url, Entries=entries)
+
+ with open('/tmp/health_status', 'w') as f:
+ f.write('1')
+ except Exception as e:
+ with open('/tmp/health_status', 'w') as f:
+ f.write('0')
+ raise e
+
+
+
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/aws-ecs-patterns-queue-isolated.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/aws-ecs-patterns-queue-isolated.assets.json
index 0602b86730628..9978621152c35 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/aws-ecs-patterns-queue-isolated.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/aws-ecs-patterns-queue-isolated.assets.json
@@ -1,13 +1,14 @@
{
- "version": "38.0.1",
+ "version": "45.0.0",
"files": {
"8786b95275c2955e9f2a234fc9985ea7267c71b4b70123cb38a445a1ed12c5c2": {
+ "displayName": "aws-ecs-patterns-queue-isolated Template",
"source": {
"path": "aws-ecs-patterns-queue-isolated.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-4320d56a": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
"objectKey": "8786b95275c2955e9f2a234fc9985ea7267c71b4b70123cb38a445a1ed12c5c2.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
@@ -17,11 +18,12 @@
},
"dockerImages": {
"205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03": {
+ "displayName": "IsolatedQueueService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage",
"source": {
"directory": "asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-b26f3a33": {
"repositoryName": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}",
"imageTag": "205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-image-publishing-role-${AWS::AccountId}-${AWS::Region}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/cdk.out
index c6e612584e352..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"38.0.1"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/integ.json
index 7ead620d6e49f..62210040f7b30 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "38.0.1",
+ "version": "45.0.0",
"testCases": {
"isolatedQueueProcessingFargateServiceTest/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "isolatedQueueProcessingFargateServiceTest/DefaultTest/DeployAssert",
"assertionStackName": "isolatedQueueProcessingFargateServiceTestDefaultTestDeployAssert0132317A"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/isolatedQueueProcessingFargateServiceTestDefaultTestDeployAssert0132317A.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/isolatedQueueProcessingFargateServiceTestDefaultTestDeployAssert0132317A.assets.json
index c326919f4018c..dc58098ceedbf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/isolatedQueueProcessingFargateServiceTestDefaultTestDeployAssert0132317A.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/isolatedQueueProcessingFargateServiceTestDefaultTestDeployAssert0132317A.assets.json
@@ -1,13 +1,14 @@
{
- "version": "38.0.1",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "isolatedQueueProcessingFargateServiceTestDefaultTestDeployAssert0132317A Template",
"source": {
"path": "isolatedQueueProcessingFargateServiceTestDefaultTestDeployAssert0132317A.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/manifest.json
index 4d1d4516e89dc..abff45535f94d 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "38.0.1",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-patterns-queue-isolated.assets": {
"type": "cdk:asset-manifest",
@@ -34,12 +34,74 @@
"aws-ecs-patterns-queue-isolated.assets"
],
"metadata": {
+ "/aws-ecs-patterns-queue-isolated/VPC": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "restrictDefaultSecurityGroup": false,
+ "maxAzs": "*",
+ "subnetConfiguration": [
+ {
+ "cidrMask": "*",
+ "name": "*",
+ "subnetType": "Public"
+ },
+ {
+ "cidrMask": "*",
+ "name": "*",
+ "subnetType": "Isolated"
+ }
+ ]
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addS3Endpoint": [
+ "*",
+ [
+ {
+ "subnetType": "Isolated"
+ }
+ ]
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/VPC/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "VPCB9E5F0B4"
}
],
+ "/aws-ecs-patterns-queue-isolated/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": {}
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/VPC/PublicSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -64,6 +126,34 @@
"data": "VPCPublicSubnet1DefaultRoute91CEF279"
}
],
+ "/aws-ecs-patterns-queue-isolated/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": {}
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/VPC/PublicSubnet2/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -88,6 +178,30 @@
"data": "VPCPublicSubnet2DefaultRouteB7481BBA"
}
],
+ "/aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1": [
+ {
+ "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": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -106,6 +220,30 @@
"data": "VPCIsolatedSubnet1RouteTableAssociationA2D18F7C"
}
],
+ "/aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2": [
+ {
+ "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": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -136,12 +274,64 @@
"data": "VPCVPCGW99B986DC"
}
],
+ "/aws-ecs-patterns-queue-isolated/VPC/S3Endpoint": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "service": {
+ "name": "*"
+ },
+ "vpc": "*",
+ "subnets": [
+ {
+ "subnetType": "Isolated"
+ }
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/VPC/S3Endpoint/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "VPCS3Endpoint18C9C7CA"
}
],
+ "/aws-ecs-patterns-queue-isolated/VPC/SqsEndpoint": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*",
+ "service": {
+ "privateDnsDefault": true,
+ "name": "*",
+ "port": "*"
+ }
+ }
+ }
+ ],
+ "/aws-ecs-patterns-queue-isolated/VPC/SqsEndpoint/SecurityGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addIngressRule": [
+ {
+ "canInlineRule": true,
+ "connections": "*",
+ "uniqueId": "*"
+ },
+ {},
+ "*",
+ false
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/VPC/SqsEndpoint/SecurityGroup/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -154,6 +344,42 @@
"data": "VPCSqsEndpoint9A40D77F"
}
],
+ "/aws-ecs-patterns-queue-isolated/VPC/EcrEndpoint": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*",
+ "service": {
+ "privateDnsDefault": true,
+ "name": "*",
+ "port": "*"
+ }
+ }
+ }
+ ],
+ "/aws-ecs-patterns-queue-isolated/VPC/EcrEndpoint/SecurityGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addIngressRule": [
+ {
+ "canInlineRule": true,
+ "connections": "*",
+ "uniqueId": "*"
+ },
+ {},
+ "*",
+ false
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/VPC/EcrEndpoint/SecurityGroup/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -166,6 +392,42 @@
"data": "VPCEcrEndpointB4F98F37"
}
],
+ "/aws-ecs-patterns-queue-isolated/VPC/EcrImageEndpoint": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*",
+ "service": {
+ "privateDnsDefault": true,
+ "name": "*",
+ "port": "*"
+ }
+ }
+ }
+ ],
+ "/aws-ecs-patterns-queue-isolated/VPC/EcrImageEndpoint/SecurityGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addIngressRule": [
+ {
+ "canInlineRule": true,
+ "connections": "*",
+ "uniqueId": "*"
+ },
+ {},
+ "*",
+ false
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/VPC/EcrImageEndpoint/SecurityGroup/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -178,6 +440,42 @@
"data": "VPCEcrImageEndpointD55381DC"
}
],
+ "/aws-ecs-patterns-queue-isolated/VPC/CloudWatchLogsEndpoint": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*",
+ "service": {
+ "privateDnsDefault": true,
+ "name": "*",
+ "port": "*"
+ }
+ }
+ }
+ ],
+ "/aws-ecs-patterns-queue-isolated/VPC/CloudWatchLogsEndpoint/SecurityGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addIngressRule": [
+ {
+ "canInlineRule": true,
+ "connections": "*",
+ "uniqueId": "*"
+ },
+ {},
+ "*",
+ false
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/VPC/CloudWatchLogsEndpoint/SecurityGroup/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -190,18 +488,46 @@
"data": "VPCCloudWatchLogsEndpointE175AF65"
}
],
+ "/aws-ecs-patterns-queue-isolated/MyCustomSG": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/MyCustomSG/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "MyCustomSGDE27C661"
}
],
+ "/aws-ecs-patterns-queue-isolated/IsolatedQueueService/EcsProcessingDeadLetterQueue": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "retentionPeriod": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/IsolatedQueueService/EcsProcessingDeadLetterQueue/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "IsolatedQueueServiceEcsProcessingDeadLetterQueue7CC1D07D"
}
],
+ "/aws-ecs-patterns-queue-isolated/IsolatedQueueService/EcsProcessingQueue": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "visibilityTimeout": "*",
+ "deadLetterQueue": {
+ "queue": "*",
+ "maxReceiveCount": "*"
+ }
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/IsolatedQueueService/EcsProcessingQueue/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -232,12 +558,105 @@
"data": "IsolatedQueueServiceSQSQueueArn571FDB86"
}
],
+ "/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ }
+ ],
+ "/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/TaskRole": [
+ {
+ "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": [
+ "*"
+ ]
+ }
+ }
+ ],
+ "/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/TaskRole/ImportTaskRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/TaskRole/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "IsolatedQueueServiceQueueProcessingTaskDefTaskRoleCFCB7511"
}
],
+ "/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/TaskRole/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": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/TaskRole/DefaultPolicy/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -250,30 +669,214 @@
"data": "IsolatedQueueServiceQueueProcessingTaskDef0F0CE105"
}
],
+ "/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "retention": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "IsolatedQueueServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupAEB959E6"
}
],
+ "/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/ExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "assumedBy": {
+ "principalAccount": "*",
+ "assumeRoleAction": "*"
+ },
+ "roleName": "*"
+ }
+ },
+ {
+ "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": [
+ {}
+ ]
+ }
+ }
+ ],
+ "/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/ExecutionRole/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "IsolatedQueueServiceQueueProcessingTaskDefExecutionRole1D7ACC77"
}
],
+ "/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/ExecutionRole/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": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "IsolatedQueueServiceQueueProcessingTaskDefExecutionRoleDefaultPolicy5667D265"
}
],
+ "/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService": [
+ {
+ "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": "*"
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/Service": [
{
"type": "aws:cdk:logicalId",
"data": "IsolatedQueueServiceQueueProcessingFargateServiceE868AEE1"
}
],
+ "/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/ScalingRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
+ "/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "serviceNamespace": "ecs",
+ "scalableDimension": "*",
+ "resourceId": "*",
+ "role": "*",
+ "minCapacity": "*",
+ "maxCapacity": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "scaleToTrackMetric": [
+ "*",
+ {
+ "predefinedMetric": "*",
+ "policyName": "*",
+ "disableScaleIn": "*",
+ "targetValue": "*",
+ "scaleInCooldown": "*"
+ }
+ ]
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "scaleOnMetric": [
+ "*",
+ {
+ "metric": {
+ "warnings": "*"
+ },
+ "scalingSteps": [
+ {
+ "upper": "*",
+ "change": "*"
+ },
+ {
+ "lower": "*",
+ "change": "*"
+ },
+ {
+ "lower": "*",
+ "change": "*"
+ }
+ ],
+ "cooldown": "*"
+ }
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -292,6 +895,29 @@
"data": "IsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy960D4BA1"
}
],
+ "/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "metric": {
+ "warnings": "*"
+ },
+ "alarmDescription": "*",
+ "comparisonOperator": "*",
+ "evaluationPeriods": "*",
+ "datapointsToAlarm": "*",
+ "threshold": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addAlarmAction": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -304,12 +930,43 @@
"data": "IsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicyFAB35025"
}
],
+ "/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "metric": {
+ "warnings": "*"
+ },
+ "alarmDescription": "*",
+ "comparisonOperator": "*",
+ "evaluationPeriods": "*",
+ "datapointsToAlarm": "*",
+ "threshold": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addAlarmAction": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "IsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperAlarm351987F5"
}
],
+ "/aws-ecs-patterns-queue-isolated/EcsDefaultClusterMnL3mNNYNVPC": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-isolated/EcsDefaultClusterMnL3mNNYNVPC/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -384,6 +1041,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/tree.json
index d2b06bc4c4ff8..55d0844609381 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/tree.json
@@ -1,2040 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-patterns-queue-isolated": {
- "id": "aws-ecs-patterns-queue-isolated",
- "path": "aws-ecs-patterns-queue-isolated",
- "children": {
- "VPC": {
- "id": "VPC",
- "path": "aws-ecs-patterns-queue-isolated/VPC",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/VPC/Resource",
- "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-ecs-patterns-queue-isolated/VPC"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet1/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 0,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.0.0/24",
- "mapPublicIpOnLaunch": true,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "Public"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Public"
- },
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPublicSubnet1RouteTableFEE4B781"
- },
- "subnetId": {
- "Ref": "VPCPublicSubnet1SubnetB4246D30"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "routeTableId": {
- "Ref": "VPCPublicSubnet1RouteTableFEE4B781"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
- "version": "0.0.0"
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet2/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 1,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.1.0/24",
- "mapPublicIpOnLaunch": true,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "Public"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Public"
- },
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPublicSubnet2RouteTable6F1A15F1"
- },
- "subnetId": {
- "Ref": "VPCPublicSubnet2Subnet74179F39"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-patterns-queue-isolated/VPC/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "routeTableId": {
- "Ref": "VPCPublicSubnet2RouteTable6F1A15F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
- "version": "0.0.0"
- }
- },
- "IsolatedSubnet1": {
- "id": "IsolatedSubnet1",
- "path": "aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 0,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.2.0/24",
- "mapPublicIpOnLaunch": false,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "Isolated"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Isolated"
- },
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCIsolatedSubnet1RouteTableEB156210"
- },
- "subnetId": {
- "Ref": "VPCIsolatedSubnet1SubnetEBD00FC6"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
- "version": "0.0.0"
- }
- },
- "IsolatedSubnet2": {
- "id": "IsolatedSubnet2",
- "path": "aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 1,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.3.0/24",
- "mapPublicIpOnLaunch": false,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "Isolated"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Isolated"
- },
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCIsolatedSubnet2RouteTable9B4F78DC"
- },
- "subnetId": {
- "Ref": "VPCIsolatedSubnet2Subnet4B1C8CAA"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
- "version": "0.0.0"
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-patterns-queue-isolated/VPC/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-patterns-queue-isolated/VPC/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- },
- "S3Endpoint": {
- "id": "S3Endpoint",
- "path": "aws-ecs-patterns-queue-isolated/VPC/S3Endpoint",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/VPC/S3Endpoint/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCEndpoint",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC"
- }
- ],
- "routeTableIds": [
- {
- "Ref": "VPCIsolatedSubnet1RouteTableEB156210"
- },
- {
- "Ref": "VPCIsolatedSubnet2RouteTable9B4F78DC"
- }
- ],
- "serviceName": {
- "Fn::Join": [
- "",
- [
- "com.amazonaws.",
- {
- "Ref": "AWS::Region"
- },
- ".s3"
- ]
- ]
- },
- "vpcEndpointType": "Gateway",
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCEndpoint",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.GatewayVpcEndpoint",
- "version": "0.0.0"
- }
- },
- "SqsEndpoint": {
- "id": "SqsEndpoint",
- "path": "aws-ecs-patterns-queue-isolated/VPC/SqsEndpoint",
- "children": {
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-patterns-queue-isolated/VPC/SqsEndpoint/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/VPC/SqsEndpoint/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-patterns-queue-isolated/VPC/SqsEndpoint/SecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "securityGroupIngress": [
- {
- "cidrIp": {
- "Fn::GetAtt": [
- "VPCB9E5F0B4",
- "CidrBlock"
- ]
- },
- "ipProtocol": "tcp",
- "fromPort": 443,
- "toPort": 443,
- "description": {
- "Fn::Join": [
- "",
- [
- "from ",
- {
- "Fn::GetAtt": [
- "VPCB9E5F0B4",
- "CidrBlock"
- ]
- },
- ":443"
- ]
- ]
- }
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/VPC/SqsEndpoint/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCEndpoint",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC"
- }
- ],
- "privateDnsEnabled": true,
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "VPCSqsEndpointSecurityGroupAE06A78D",
- "GroupId"
- ]
- }
- ],
- "serviceName": {
- "Fn::Join": [
- "",
- [
- "com.amazonaws.",
- {
- "Ref": "AWS::Region"
- },
- ".sqs"
- ]
- ]
- },
- "subnetIds": [
- {
- "Ref": "VPCIsolatedSubnet1SubnetEBD00FC6"
- },
- {
- "Ref": "VPCIsolatedSubnet2Subnet4B1C8CAA"
- }
- ],
- "vpcEndpointType": "Interface",
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCEndpoint",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.InterfaceVpcEndpoint",
- "version": "0.0.0"
- }
- },
- "EcrEndpoint": {
- "id": "EcrEndpoint",
- "path": "aws-ecs-patterns-queue-isolated/VPC/EcrEndpoint",
- "children": {
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-patterns-queue-isolated/VPC/EcrEndpoint/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/VPC/EcrEndpoint/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-patterns-queue-isolated/VPC/EcrEndpoint/SecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "securityGroupIngress": [
- {
- "cidrIp": {
- "Fn::GetAtt": [
- "VPCB9E5F0B4",
- "CidrBlock"
- ]
- },
- "ipProtocol": "tcp",
- "fromPort": 443,
- "toPort": 443,
- "description": {
- "Fn::Join": [
- "",
- [
- "from ",
- {
- "Fn::GetAtt": [
- "VPCB9E5F0B4",
- "CidrBlock"
- ]
- },
- ":443"
- ]
- ]
- }
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/VPC/EcrEndpoint/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCEndpoint",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC"
- }
- ],
- "privateDnsEnabled": true,
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "VPCEcrEndpointSecurityGroup50ED8BA4",
- "GroupId"
- ]
- }
- ],
- "serviceName": {
- "Fn::Join": [
- "",
- [
- "com.amazonaws.",
- {
- "Ref": "AWS::Region"
- },
- ".ecr.api"
- ]
- ]
- },
- "subnetIds": [
- {
- "Ref": "VPCIsolatedSubnet1SubnetEBD00FC6"
- },
- {
- "Ref": "VPCIsolatedSubnet2Subnet4B1C8CAA"
- }
- ],
- "vpcEndpointType": "Interface",
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCEndpoint",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.InterfaceVpcEndpoint",
- "version": "0.0.0"
- }
- },
- "EcrImageEndpoint": {
- "id": "EcrImageEndpoint",
- "path": "aws-ecs-patterns-queue-isolated/VPC/EcrImageEndpoint",
- "children": {
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-patterns-queue-isolated/VPC/EcrImageEndpoint/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/VPC/EcrImageEndpoint/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-patterns-queue-isolated/VPC/EcrImageEndpoint/SecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "securityGroupIngress": [
- {
- "cidrIp": {
- "Fn::GetAtt": [
- "VPCB9E5F0B4",
- "CidrBlock"
- ]
- },
- "ipProtocol": "tcp",
- "fromPort": 443,
- "toPort": 443,
- "description": {
- "Fn::Join": [
- "",
- [
- "from ",
- {
- "Fn::GetAtt": [
- "VPCB9E5F0B4",
- "CidrBlock"
- ]
- },
- ":443"
- ]
- ]
- }
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/VPC/EcrImageEndpoint/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCEndpoint",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC"
- }
- ],
- "privateDnsEnabled": true,
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "VPCEcrImageEndpointSecurityGroup83621638",
- "GroupId"
- ]
- }
- ],
- "serviceName": {
- "Fn::Join": [
- "",
- [
- "com.amazonaws.",
- {
- "Ref": "AWS::Region"
- },
- ".ecr.dkr"
- ]
- ]
- },
- "subnetIds": [
- {
- "Ref": "VPCIsolatedSubnet1SubnetEBD00FC6"
- },
- {
- "Ref": "VPCIsolatedSubnet2Subnet4B1C8CAA"
- }
- ],
- "vpcEndpointType": "Interface",
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCEndpoint",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.InterfaceVpcEndpoint",
- "version": "0.0.0"
- }
- },
- "CloudWatchLogsEndpoint": {
- "id": "CloudWatchLogsEndpoint",
- "path": "aws-ecs-patterns-queue-isolated/VPC/CloudWatchLogsEndpoint",
- "children": {
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-patterns-queue-isolated/VPC/CloudWatchLogsEndpoint/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/VPC/CloudWatchLogsEndpoint/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-patterns-queue-isolated/VPC/CloudWatchLogsEndpoint/SecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "securityGroupIngress": [
- {
- "cidrIp": {
- "Fn::GetAtt": [
- "VPCB9E5F0B4",
- "CidrBlock"
- ]
- },
- "ipProtocol": "tcp",
- "fromPort": 443,
- "toPort": 443,
- "description": {
- "Fn::Join": [
- "",
- [
- "from ",
- {
- "Fn::GetAtt": [
- "VPCB9E5F0B4",
- "CidrBlock"
- ]
- },
- ":443"
- ]
- ]
- }
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/VPC/CloudWatchLogsEndpoint/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCEndpoint",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-isolated/VPC"
- }
- ],
- "privateDnsEnabled": true,
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "VPCCloudWatchLogsEndpointSecurityGroup967DBC94",
- "GroupId"
- ]
- }
- ],
- "serviceName": {
- "Fn::Join": [
- "",
- [
- "com.amazonaws.",
- {
- "Ref": "AWS::Region"
- },
- ".logs"
- ]
- ]
- },
- "subnetIds": [
- {
- "Ref": "VPCIsolatedSubnet1SubnetEBD00FC6"
- },
- {
- "Ref": "VPCIsolatedSubnet2Subnet4B1C8CAA"
- }
- ],
- "vpcEndpointType": "Interface",
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCEndpoint",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.InterfaceVpcEndpoint",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0"
- }
- },
- "MyCustomSG": {
- "id": "MyCustomSG",
- "path": "aws-ecs-patterns-queue-isolated/MyCustomSG",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/MyCustomSG/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-patterns-queue-isolated/MyCustomSG",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0"
- }
- },
- "IsolatedQueueService": {
- "id": "IsolatedQueueService",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService",
- "children": {
- "EcsProcessingDeadLetterQueue": {
- "id": "EcsProcessingDeadLetterQueue",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/EcsProcessingDeadLetterQueue",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/EcsProcessingDeadLetterQueue/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SQS::Queue",
- "aws:cdk:cloudformation:props": {
- "messageRetentionPeriod": 1209600
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.CfnQueue",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.Queue",
- "version": "0.0.0"
- }
- },
- "EcsProcessingQueue": {
- "id": "EcsProcessingQueue",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/EcsProcessingQueue",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/EcsProcessingQueue/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SQS::Queue",
- "aws:cdk:cloudformation:props": {
- "redrivePolicy": {
- "deadLetterTargetArn": {
- "Fn::GetAtt": [
- "IsolatedQueueServiceEcsProcessingDeadLetterQueue7CC1D07D",
- "Arn"
- ]
- },
- "maxReceiveCount": 3
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.CfnQueue",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.Queue",
- "version": "0.0.0"
- }
- },
- "SQSDeadLetterQueue": {
- "id": "SQSDeadLetterQueue",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/SQSDeadLetterQueue",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "SQSDeadLetterQueueArn": {
- "id": "SQSDeadLetterQueueArn",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/SQSDeadLetterQueueArn",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "SQSQueue": {
- "id": "SQSQueue",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/SQSQueue",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "SQSQueueArn": {
- "id": "SQSQueueArn",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/SQSQueueArn",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "QueueProcessingTaskDef": {
- "id": "QueueProcessingTaskDef",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/TaskRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/TaskRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "sqs:ChangeMessageVisibility",
- "sqs:DeleteMessage",
- "sqs:GetQueueAttributes",
- "sqs:GetQueueUrl",
- "sqs:ReceiveMessage"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "IsolatedQueueServiceEcsProcessingQueueCCE172F1",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "IsolatedQueueServiceQueueProcessingTaskDefTaskRoleDefaultPolicyD52E156B",
- "roles": [
- {
- "Ref": "IsolatedQueueServiceQueueProcessingTaskDefTaskRoleCFCB7511"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": {
- "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03"
- },
- "name": "QueueProcessingContainer",
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": {
- "Ref": "IsolatedQueueServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupAEB959E6"
- },
- "awslogs-stream-prefix": "IsolatedQueueService",
- "awslogs-region": {
- "Ref": "AWS::Region"
- }
- }
- },
- "environment": [
- {
- "name": "QUEUE_NAME",
- "value": {
- "Fn::GetAtt": [
- "IsolatedQueueServiceEcsProcessingQueueCCE172F1",
- "QueueName"
- ]
- }
- }
- ]
- }
- ],
- "cpu": "256",
- "executionRoleArn": {
- "Fn::GetAtt": [
- "IsolatedQueueServiceQueueProcessingTaskDefExecutionRole1D7ACC77",
- "Arn"
- ]
- },
- "family": "awsecspatternsqueueisolatedIsolatedQueueServiceQueueProcessingTaskDef27DBAF49",
- "memory": "512",
- "networkMode": "awsvpc",
- "requiresCompatibilities": [
- "FARGATE"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "IsolatedQueueServiceQueueProcessingTaskDefTaskRoleCFCB7511",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "QueueProcessingContainer": {
- "id": "QueueProcessingContainer",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/QueueProcessingContainer",
- "children": {
- "AssetImage": {
- "id": "AssetImage",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage",
- "children": {
- "Staging": {
- "id": "Staging",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Staging",
- "constructInfo": {
- "fqn": "aws-cdk-lib.AssetStaging",
- "version": "0.0.0"
- }
- },
- "Repository": {
- "id": "Repository",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Repository",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset",
- "version": "0.0.0"
- }
- },
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "ecr:BatchCheckLayerAvailability",
- "ecr:BatchGetImage",
- "ecr:GetDownloadUrlForLayer"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecr:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":repository/",
- {
- "Fn::Sub": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"
- }
- ]
- ]
- }
- },
- {
- "Action": "ecr:GetAuthorizationToken",
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "IsolatedQueueServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupAEB959E6",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "IsolatedQueueServiceQueueProcessingTaskDefExecutionRoleDefaultPolicy5667D265",
- "roles": [
- {
- "Ref": "IsolatedQueueServiceQueueProcessingTaskDefExecutionRole1D7ACC77"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.FargateTaskDefinition",
- "version": "0.0.0"
- }
- },
- "QueueProcessingFargateService": {
- "id": "QueueProcessingFargateService",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "launchType": "FARGATE",
- "networkConfiguration": {
- "awsvpcConfiguration": {
- "assignPublicIp": "DISABLED",
- "subnets": [
- {
- "Ref": "VPCIsolatedSubnet1SubnetEBD00FC6"
- },
- {
- "Ref": "VPCIsolatedSubnet2Subnet4B1C8CAA"
- }
- ],
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "MyCustomSGDE27C661",
- "GroupId"
- ]
- }
- ]
- }
- },
- "taskDefinition": {
- "Ref": "IsolatedQueueServiceQueueProcessingTaskDef0F0CE105"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- },
- "ScalingRole": {
- "id": "ScalingRole",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/ScalingRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "TaskCount": {
- "id": "TaskCount",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount",
- "children": {
- "Target": {
- "id": "Target",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ApplicationAutoScaling::ScalableTarget",
- "aws:cdk:cloudformation:props": {
- "maxCapacity": 2,
- "minCapacity": 1,
- "resourceId": {
- "Fn::Join": [
- "",
- [
- "service/",
- {
- "Ref": "EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"
- },
- "/",
- {
- "Fn::GetAtt": [
- "IsolatedQueueServiceQueueProcessingFargateServiceE868AEE1",
- "Name"
- ]
- }
- ]
- ]
- },
- "roleArn": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":iam::",
- {
- "Ref": "AWS::AccountId"
- },
- ":role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService"
- ]
- ]
- },
- "scalableDimension": "ecs:service:DesiredCount",
- "serviceNamespace": "ecs"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.CfnScalableTarget",
- "version": "0.0.0"
- }
- },
- "CpuScaling": {
- "id": "CpuScaling",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/CpuScaling",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/CpuScaling/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ApplicationAutoScaling::ScalingPolicy",
- "aws:cdk:cloudformation:props": {
- "policyName": "awsecspatternsqueueisolatedIsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetCpuScaling8B2FB6C4",
- "policyType": "TargetTrackingScaling",
- "scalingTargetId": {
- "Ref": "IsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetB06FD17D"
- },
- "targetTrackingScalingPolicyConfiguration": {
- "predefinedMetricSpecification": {
- "predefinedMetricType": "ECSServiceAverageCPUUtilization"
- },
- "targetValue": 50
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.TargetTrackingScalingPolicy",
- "version": "0.0.0"
- }
- },
- "QueueMessagesVisibleScaling": {
- "id": "QueueMessagesVisibleScaling",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling",
- "children": {
- "LowerPolicy": {
- "id": "LowerPolicy",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ApplicationAutoScaling::ScalingPolicy",
- "aws:cdk:cloudformation:props": {
- "policyName": "awsecspatternsqueueisolatedIsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy5EFC8D1B",
- "policyType": "StepScaling",
- "scalingTargetId": {
- "Ref": "IsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetB06FD17D"
- },
- "stepScalingPolicyConfiguration": {
- "adjustmentType": "ChangeInCapacity",
- "metricAggregationType": "Maximum",
- "stepAdjustments": [
- {
- "metricIntervalUpperBound": 0,
- "scalingAdjustment": -1
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.StepScalingAction",
- "version": "0.0.0"
- }
- },
- "LowerAlarm": {
- "id": "LowerAlarm",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::CloudWatch::Alarm",
- "aws:cdk:cloudformation:props": {
- "alarmActions": [
- {
- "Ref": "IsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy960D4BA1"
- }
- ],
- "alarmDescription": "Lower threshold scaling alarm",
- "comparisonOperator": "LessThanOrEqualToThreshold",
- "dimensions": [
- {
- "name": "QueueName",
- "value": {
- "Fn::GetAtt": [
- "IsolatedQueueServiceEcsProcessingQueueCCE172F1",
- "QueueName"
- ]
- }
- }
- ],
- "evaluationPeriods": 1,
- "metricName": "ApproximateNumberOfMessagesVisible",
- "namespace": "AWS/SQS",
- "period": 300,
- "statistic": "Maximum",
- "threshold": 0
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.CfnAlarm",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.Alarm",
- "version": "0.0.0"
- }
- },
- "UpperPolicy": {
- "id": "UpperPolicy",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ApplicationAutoScaling::ScalingPolicy",
- "aws:cdk:cloudformation:props": {
- "policyName": "awsecspatternsqueueisolatedIsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy51E582BF",
- "policyType": "StepScaling",
- "scalingTargetId": {
- "Ref": "IsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetB06FD17D"
- },
- "stepScalingPolicyConfiguration": {
- "adjustmentType": "ChangeInCapacity",
- "metricAggregationType": "Maximum",
- "stepAdjustments": [
- {
- "metricIntervalLowerBound": 0,
- "metricIntervalUpperBound": 400,
- "scalingAdjustment": 1
- },
- {
- "metricIntervalLowerBound": 400,
- "scalingAdjustment": 5
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.StepScalingAction",
- "version": "0.0.0"
- }
- },
- "UpperAlarm": {
- "id": "UpperAlarm",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::CloudWatch::Alarm",
- "aws:cdk:cloudformation:props": {
- "alarmActions": [
- {
- "Ref": "IsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicyFAB35025"
- }
- ],
- "alarmDescription": "Upper threshold scaling alarm",
- "comparisonOperator": "GreaterThanOrEqualToThreshold",
- "dimensions": [
- {
- "name": "QueueName",
- "value": {
- "Fn::GetAtt": [
- "IsolatedQueueServiceEcsProcessingQueueCCE172F1",
- "QueueName"
- ]
- }
- }
- ],
- "evaluationPeriods": 1,
- "metricName": "ApproximateNumberOfMessagesVisible",
- "namespace": "AWS/SQS",
- "period": 300,
- "statistic": "Maximum",
- "threshold": 100
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.CfnAlarm",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.Alarm",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.StepScalingPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.ScalableTarget",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ScalableTaskCount",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.FargateService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs_patterns.QueueProcessingFargateService",
- "version": "0.0.0"
- }
- },
- "EcsDefaultClusterMnL3mNNYNVPC": {
- "id": "EcsDefaultClusterMnL3mNNYNVPC",
- "path": "aws-ecs-patterns-queue-isolated/EcsDefaultClusterMnL3mNNYNVPC",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-isolated/EcsDefaultClusterMnL3mNNYNVPC/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-patterns-queue-isolated/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-patterns-queue-isolated/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "isolatedQueueProcessingFargateServiceTest": {
- "id": "isolatedQueueProcessingFargateServiceTest",
- "path": "isolatedQueueProcessingFargateServiceTest",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "isolatedQueueProcessingFargateServiceTest/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "isolatedQueueProcessingFargateServiceTest/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "isolatedQueueProcessingFargateServiceTest/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "isolatedQueueProcessingFargateServiceTest/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "isolatedQueueProcessingFargateServiceTest/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-patterns-queue-isolated":{"id":"aws-ecs-patterns-queue-isolated","path":"aws-ecs-patterns-queue-isolated","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"VPC":{"id":"VPC","path":"aws-ecs-patterns-queue-isolated/VPC","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"restrictDefaultSecurityGroup":false,"maxAzs":"*","subnetConfiguration":[{"cidrMask":"*","name":"*","subnetType":"Public"},{"cidrMask":"*","name":"*","subnetType":"Isolated"}]},{"addS3Endpoint":["*",[{"subnetType":"Isolated"}]]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/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-ecs-patterns-queue-isolated/VPC"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-patterns-queue-isolated/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":"*"},{}]},"children":{"Subnet":{"id":"Subnet","path":"aws-ecs-patterns-queue-isolated/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/24","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"aws-ecs-patterns-queue-isolated/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-isolated/VPC/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-isolated/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-ecs-patterns-queue-isolated/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-isolated/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-ecs-patterns-queue-isolated/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"}}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-patterns-queue-isolated/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":"*"},{}]},"children":{"Subnet":{"id":"Subnet","path":"aws-ecs-patterns-queue-isolated/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.1.0/24","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"aws-ecs-patterns-queue-isolated/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-isolated/VPC/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-isolated/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-ecs-patterns-queue-isolated/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-isolated/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-ecs-patterns-queue-isolated/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"}}}}}},"IsolatedSubnet1":{"id":"IsolatedSubnet1","path":"aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1","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-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1/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.2.0/24","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Isolated"},{"key":"aws-cdk:subnet-type","value":"Isolated"},{"key":"Name","value":"aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1/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-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet1/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":"VPCIsolatedSubnet1RouteTableEB156210"},"subnetId":{"Ref":"VPCIsolatedSubnet1SubnetEBD00FC6"}}}}}},"IsolatedSubnet2":{"id":"IsolatedSubnet2","path":"aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2","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-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2/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.3.0/24","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Isolated"},{"key":"aws-cdk:subnet-type","value":"Isolated"},{"key":"Name","value":"aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2/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-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-isolated/VPC/IsolatedSubnet2/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":"VPCIsolatedSubnet2RouteTable9B4F78DC"},"subnetId":{"Ref":"VPCIsolatedSubnet2Subnet4B1C8CAA"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-patterns-queue-isolated/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-ecs-patterns-queue-isolated/VPC"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-patterns-queue-isolated/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"}}}},"S3Endpoint":{"id":"S3Endpoint","path":"aws-ecs-patterns-queue-isolated/VPC/S3Endpoint","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.GatewayVpcEndpoint","version":"0.0.0","metadata":[{"service":{"name":"*"},"vpc":"*","subnets":[{"subnetType":"Isolated"}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/VPC/S3Endpoint/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPCEndpoint","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPCEndpoint","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-isolated/VPC"}],"routeTableIds":[{"Ref":"VPCIsolatedSubnet1RouteTableEB156210"},{"Ref":"VPCIsolatedSubnet2RouteTable9B4F78DC"}],"serviceName":{"Fn::Join":["",["com.amazonaws.",{"Ref":"AWS::Region"},".s3"]]},"vpcEndpointType":"Gateway","vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"SqsEndpoint":{"id":"SqsEndpoint","path":"aws-ecs-patterns-queue-isolated/VPC/SqsEndpoint","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.InterfaceVpcEndpoint","version":"0.0.0","metadata":[{"vpc":"*","service":{"privateDnsDefault":true,"name":"*","port":"*"}}]},"children":{"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-patterns-queue-isolated/VPC/SqsEndpoint/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"},{"addIngressRule":[{"canInlineRule":true,"connections":"*","uniqueId":"*"},{},"*",false]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/VPC/SqsEndpoint/SecurityGroup/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-ecs-patterns-queue-isolated/VPC/SqsEndpoint/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"securityGroupIngress":[{"cidrIp":{"Fn::GetAtt":["VPCB9E5F0B4","CidrBlock"]},"ipProtocol":"tcp","fromPort":443,"toPort":443,"description":{"Fn::Join":["",["from ",{"Fn::GetAtt":["VPCB9E5F0B4","CidrBlock"]},":443"]]}}],"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-isolated/VPC"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/VPC/SqsEndpoint/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPCEndpoint","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPCEndpoint","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-isolated/VPC"}],"privateDnsEnabled":true,"securityGroupIds":[{"Fn::GetAtt":["VPCSqsEndpointSecurityGroupAE06A78D","GroupId"]}],"serviceName":{"Fn::Join":["",["com.amazonaws.",{"Ref":"AWS::Region"},".sqs"]]},"subnetIds":[{"Ref":"VPCIsolatedSubnet1SubnetEBD00FC6"},{"Ref":"VPCIsolatedSubnet2Subnet4B1C8CAA"}],"vpcEndpointType":"Interface","vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"EcrEndpoint":{"id":"EcrEndpoint","path":"aws-ecs-patterns-queue-isolated/VPC/EcrEndpoint","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.InterfaceVpcEndpoint","version":"0.0.0","metadata":[{"vpc":"*","service":{"privateDnsDefault":true,"name":"*","port":"*"}}]},"children":{"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-patterns-queue-isolated/VPC/EcrEndpoint/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"},{"addIngressRule":[{"canInlineRule":true,"connections":"*","uniqueId":"*"},{},"*",false]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/VPC/EcrEndpoint/SecurityGroup/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-ecs-patterns-queue-isolated/VPC/EcrEndpoint/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"securityGroupIngress":[{"cidrIp":{"Fn::GetAtt":["VPCB9E5F0B4","CidrBlock"]},"ipProtocol":"tcp","fromPort":443,"toPort":443,"description":{"Fn::Join":["",["from ",{"Fn::GetAtt":["VPCB9E5F0B4","CidrBlock"]},":443"]]}}],"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-isolated/VPC"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/VPC/EcrEndpoint/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPCEndpoint","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPCEndpoint","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-isolated/VPC"}],"privateDnsEnabled":true,"securityGroupIds":[{"Fn::GetAtt":["VPCEcrEndpointSecurityGroup50ED8BA4","GroupId"]}],"serviceName":{"Fn::Join":["",["com.amazonaws.",{"Ref":"AWS::Region"},".ecr.api"]]},"subnetIds":[{"Ref":"VPCIsolatedSubnet1SubnetEBD00FC6"},{"Ref":"VPCIsolatedSubnet2Subnet4B1C8CAA"}],"vpcEndpointType":"Interface","vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"EcrImageEndpoint":{"id":"EcrImageEndpoint","path":"aws-ecs-patterns-queue-isolated/VPC/EcrImageEndpoint","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.InterfaceVpcEndpoint","version":"0.0.0","metadata":[{"vpc":"*","service":{"privateDnsDefault":true,"name":"*","port":"*"}}]},"children":{"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-patterns-queue-isolated/VPC/EcrImageEndpoint/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"},{"addIngressRule":[{"canInlineRule":true,"connections":"*","uniqueId":"*"},{},"*",false]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/VPC/EcrImageEndpoint/SecurityGroup/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-ecs-patterns-queue-isolated/VPC/EcrImageEndpoint/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"securityGroupIngress":[{"cidrIp":{"Fn::GetAtt":["VPCB9E5F0B4","CidrBlock"]},"ipProtocol":"tcp","fromPort":443,"toPort":443,"description":{"Fn::Join":["",["from ",{"Fn::GetAtt":["VPCB9E5F0B4","CidrBlock"]},":443"]]}}],"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-isolated/VPC"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/VPC/EcrImageEndpoint/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPCEndpoint","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPCEndpoint","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-isolated/VPC"}],"privateDnsEnabled":true,"securityGroupIds":[{"Fn::GetAtt":["VPCEcrImageEndpointSecurityGroup83621638","GroupId"]}],"serviceName":{"Fn::Join":["",["com.amazonaws.",{"Ref":"AWS::Region"},".ecr.dkr"]]},"subnetIds":[{"Ref":"VPCIsolatedSubnet1SubnetEBD00FC6"},{"Ref":"VPCIsolatedSubnet2Subnet4B1C8CAA"}],"vpcEndpointType":"Interface","vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"CloudWatchLogsEndpoint":{"id":"CloudWatchLogsEndpoint","path":"aws-ecs-patterns-queue-isolated/VPC/CloudWatchLogsEndpoint","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.InterfaceVpcEndpoint","version":"0.0.0","metadata":[{"vpc":"*","service":{"privateDnsDefault":true,"name":"*","port":"*"}}]},"children":{"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-patterns-queue-isolated/VPC/CloudWatchLogsEndpoint/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"},{"addIngressRule":[{"canInlineRule":true,"connections":"*","uniqueId":"*"},{},"*",false]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/VPC/CloudWatchLogsEndpoint/SecurityGroup/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-ecs-patterns-queue-isolated/VPC/CloudWatchLogsEndpoint/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"securityGroupIngress":[{"cidrIp":{"Fn::GetAtt":["VPCB9E5F0B4","CidrBlock"]},"ipProtocol":"tcp","fromPort":443,"toPort":443,"description":{"Fn::Join":["",["from ",{"Fn::GetAtt":["VPCB9E5F0B4","CidrBlock"]},":443"]]}}],"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-isolated/VPC"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/VPC/CloudWatchLogsEndpoint/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPCEndpoint","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPCEndpoint","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-isolated/VPC"}],"privateDnsEnabled":true,"securityGroupIds":[{"Fn::GetAtt":["VPCCloudWatchLogsEndpointSecurityGroup967DBC94","GroupId"]}],"serviceName":{"Fn::Join":["",["com.amazonaws.",{"Ref":"AWS::Region"},".logs"]]},"subnetIds":[{"Ref":"VPCIsolatedSubnet1SubnetEBD00FC6"},{"Ref":"VPCIsolatedSubnet2Subnet4B1C8CAA"}],"vpcEndpointType":"Interface","vpcId":{"Ref":"VPCB9E5F0B4"}}}}}}}},"MyCustomSG":{"id":"MyCustomSG","path":"aws-ecs-patterns-queue-isolated/MyCustomSG","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/MyCustomSG/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-ecs-patterns-queue-isolated/MyCustomSG","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"IsolatedQueueService":{"id":"IsolatedQueueService","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.QueueProcessingFargateService","version":"0.0.0"},"children":{"EcsProcessingDeadLetterQueue":{"id":"EcsProcessingDeadLetterQueue","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/EcsProcessingDeadLetterQueue","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.Queue","version":"0.0.0","metadata":[{"retentionPeriod":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/EcsProcessingDeadLetterQueue/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueue","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::Queue","aws:cdk:cloudformation:props":{"messageRetentionPeriod":1209600}}}}},"EcsProcessingQueue":{"id":"EcsProcessingQueue","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/EcsProcessingQueue","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.Queue","version":"0.0.0","metadata":[{"visibilityTimeout":"*","deadLetterQueue":{"queue":"*","maxReceiveCount":"*"}}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/EcsProcessingQueue/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueue","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::Queue","aws:cdk:cloudformation:props":{"redrivePolicy":{"deadLetterTargetArn":{"Fn::GetAtt":["IsolatedQueueServiceEcsProcessingDeadLetterQueue7CC1D07D","Arn"]},"maxReceiveCount":3}}}}}},"SQSDeadLetterQueue":{"id":"SQSDeadLetterQueue","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/SQSDeadLetterQueue","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSDeadLetterQueueArn":{"id":"SQSDeadLetterQueueArn","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/SQSDeadLetterQueueArn","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSQueue":{"id":"SQSQueue","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/SQSQueue","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSQueueArn":{"id":"SQSQueueArn","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/SQSQueueArn","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"QueueProcessingTaskDef":{"id":"QueueProcessingTaskDef","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateTaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/TaskRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/TaskRole/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":["sqs:ChangeMessageVisibility","sqs:DeleteMessage","sqs:GetQueueAttributes","sqs:GetQueueUrl","sqs:ReceiveMessage"],"Effect":"Allow","Resource":{"Fn::GetAtt":["IsolatedQueueServiceEcsProcessingQueueCCE172F1","Arn"]}}],"Version":"2012-10-17"},"policyName":"IsolatedQueueServiceQueueProcessingTaskDefTaskRoleDefaultPolicyD52E156B","roles":[{"Ref":"IsolatedQueueServiceQueueProcessingTaskDefTaskRoleCFCB7511"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/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":{"Fn::Sub":"${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03"},"name":"QueueProcessingContainer","logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"IsolatedQueueServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupAEB959E6"},"awslogs-stream-prefix":"IsolatedQueueService","awslogs-region":{"Ref":"AWS::Region"}}},"environment":[{"name":"QUEUE_NAME","value":{"Fn::GetAtt":["IsolatedQueueServiceEcsProcessingQueueCCE172F1","QueueName"]}}]}],"cpu":"256","executionRoleArn":{"Fn::GetAtt":["IsolatedQueueServiceQueueProcessingTaskDefExecutionRole1D7ACC77","Arn"]},"family":"awsecspatternsqueueisolatedIsolatedQueueServiceQueueProcessingTaskDef27DBAF49","memory":"512","networkMode":"awsvpc","requiresCompatibilities":["FARGATE"],"taskRoleArn":{"Fn::GetAtt":["IsolatedQueueServiceQueueProcessingTaskDefTaskRoleCFCB7511","Arn"]}}}},"QueueProcessingContainer":{"id":"QueueProcessingContainer","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/QueueProcessingContainer","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"AssetImage":{"id":"AssetImage","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr_assets.DockerImageAsset","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Repository":{"id":"Repository","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Repository","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr.RepositoryBase","version":"0.0.0","metadata":[]}}}},"LogGroup":{"id":"LogGroup","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/ExecutionRole/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-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingTaskDef/ExecutionRole/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":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Fn::Sub":"cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"}]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"},{"Action":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["IsolatedQueueServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupAEB959E6","Arn"]}}],"Version":"2012-10-17"},"policyName":"IsolatedQueueServiceQueueProcessingTaskDefExecutionRoleDefaultPolicy5667D265","roles":[{"Ref":"IsolatedQueueServiceQueueProcessingTaskDefExecutionRole1D7ACC77"}]}}}}}}}}},"QueueProcessingFargateService":{"id":"QueueProcessingFargateService","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateService","version":"0.0.0","metadata":["*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/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":"EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"launchType":"FARGATE","networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"DISABLED","subnets":[{"Ref":"VPCIsolatedSubnet1SubnetEBD00FC6"},{"Ref":"VPCIsolatedSubnet2Subnet4B1C8CAA"}],"securityGroups":[{"Fn::GetAtt":["MyCustomSGDE27C661","GroupId"]}]}},"taskDefinition":{"Ref":"IsolatedQueueServiceQueueProcessingTaskDef0F0CE105"}}}},"ScalingRole":{"id":"ScalingRole","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/ScalingRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"TaskCount":{"id":"TaskCount","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ScalableTaskCount","version":"0.0.0"},"children":{"Target":{"id":"Target","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.ScalableTarget","version":"0.0.0","metadata":[{"serviceNamespace":"ecs","scalableDimension":"*","resourceId":"*","role":"*","minCapacity":"*","maxCapacity":"*"},{"scaleToTrackMetric":["*",{"predefinedMetric":"*","policyName":"*","disableScaleIn":"*","targetValue":"*","scaleInCooldown":"*"}]},{"scaleOnMetric":["*",{"metric":{"warnings":"*"},"scalingSteps":[{"upper":"*","change":"*"},{"lower":"*","change":"*"},{"lower":"*","change":"*"}],"cooldown":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalableTarget","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalableTarget","aws:cdk:cloudformation:props":{"maxCapacity":2,"minCapacity":1,"resourceId":{"Fn::Join":["",["service/",{"Ref":"EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"},"/",{"Fn::GetAtt":["IsolatedQueueServiceQueueProcessingFargateServiceE868AEE1","Name"]}]]},"roleArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::",{"Ref":"AWS::AccountId"},":role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService"]]},"scalableDimension":"ecs:service:DesiredCount","serviceNamespace":"ecs"}}},"CpuScaling":{"id":"CpuScaling","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/CpuScaling","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.TargetTrackingScalingPolicy","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/CpuScaling/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueueisolatedIsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetCpuScaling8B2FB6C4","policyType":"TargetTrackingScaling","scalingTargetId":{"Ref":"IsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetB06FD17D"},"targetTrackingScalingPolicyConfiguration":{"predefinedMetricSpecification":{"predefinedMetricType":"ECSServiceAverageCPUUtilization"},"targetValue":50}}}}}},"QueueMessagesVisibleScaling":{"id":"QueueMessagesVisibleScaling","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingPolicy","version":"0.0.0"},"children":{"LowerPolicy":{"id":"LowerPolicy","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingAction","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueueisolatedIsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy5EFC8D1B","policyType":"StepScaling","scalingTargetId":{"Ref":"IsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetB06FD17D"},"stepScalingPolicyConfiguration":{"adjustmentType":"ChangeInCapacity","metricAggregationType":"Maximum","stepAdjustments":[{"metricIntervalUpperBound":0,"scalingAdjustment":-1}]}}}}}},"LowerAlarm":{"id":"LowerAlarm","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.Alarm","version":"0.0.0","metadata":[{"metric":{"warnings":"*"},"alarmDescription":"*","comparisonOperator":"*","evaluationPeriods":"*","datapointsToAlarm":"*","threshold":"*"},{"addAlarmAction":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.CfnAlarm","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CloudWatch::Alarm","aws:cdk:cloudformation:props":{"alarmActions":[{"Ref":"IsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy960D4BA1"}],"alarmDescription":"Lower threshold scaling alarm","comparisonOperator":"LessThanOrEqualToThreshold","dimensions":[{"name":"QueueName","value":{"Fn::GetAtt":["IsolatedQueueServiceEcsProcessingQueueCCE172F1","QueueName"]}}],"evaluationPeriods":1,"metricName":"ApproximateNumberOfMessagesVisible","namespace":"AWS/SQS","period":300,"statistic":"Maximum","threshold":0}}}}},"UpperPolicy":{"id":"UpperPolicy","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingAction","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueueisolatedIsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy51E582BF","policyType":"StepScaling","scalingTargetId":{"Ref":"IsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetB06FD17D"},"stepScalingPolicyConfiguration":{"adjustmentType":"ChangeInCapacity","metricAggregationType":"Maximum","stepAdjustments":[{"metricIntervalLowerBound":0,"metricIntervalUpperBound":400,"scalingAdjustment":1},{"metricIntervalLowerBound":400,"scalingAdjustment":5}]}}}}}},"UpperAlarm":{"id":"UpperAlarm","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.Alarm","version":"0.0.0","metadata":[{"metric":{"warnings":"*"},"alarmDescription":"*","comparisonOperator":"*","evaluationPeriods":"*","datapointsToAlarm":"*","threshold":"*"},{"addAlarmAction":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/IsolatedQueueService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.CfnAlarm","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CloudWatch::Alarm","aws:cdk:cloudformation:props":{"alarmActions":[{"Ref":"IsolatedQueueServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicyFAB35025"}],"alarmDescription":"Upper threshold scaling alarm","comparisonOperator":"GreaterThanOrEqualToThreshold","dimensions":[{"name":"QueueName","value":{"Fn::GetAtt":["IsolatedQueueServiceEcsProcessingQueueCCE172F1","QueueName"]}}],"evaluationPeriods":1,"metricName":"ApproximateNumberOfMessagesVisible","namespace":"AWS/SQS","period":300,"statistic":"Maximum","threshold":100}}}}}}}}}}}}}}},"EcsDefaultClusterMnL3mNNYNVPC":{"id":"EcsDefaultClusterMnL3mNNYNVPC","path":"aws-ecs-patterns-queue-isolated/EcsDefaultClusterMnL3mNNYNVPC","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-isolated/EcsDefaultClusterMnL3mNNYNVPC/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":{}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-patterns-queue-isolated/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-patterns-queue-isolated/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"isolatedQueueProcessingFargateServiceTest":{"id":"isolatedQueueProcessingFargateServiceTest","path":"isolatedQueueProcessingFargateServiceTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"isolatedQueueProcessingFargateServiceTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"isolatedQueueProcessingFargateServiceTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"isolatedQueueProcessingFargateServiceTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"isolatedQueueProcessingFargateServiceTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"isolatedQueueProcessingFargateServiceTest/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-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03/Dockerfile b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03/Dockerfile
new file mode 100644
index 0000000000000..030d33bfed21f
--- /dev/null
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03/Dockerfile
@@ -0,0 +1,11 @@
+FROM public.ecr.aws/lambda/python:3.11
+
+RUN pip3 install boto3
+
+ENV QUEUE_NAME $QUEUE_NAME
+ENV PYTHONUNBUFFERED=1
+
+WORKDIR /src
+ADD . /src
+
+ENTRYPOINT [ "python3", "index.py"]
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03/index.py b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03/index.py
new file mode 100644
index 0000000000000..e1bddd6e8d3ff
--- /dev/null
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03/index.py
@@ -0,0 +1,32 @@
+#!/usr/bin/python
+import os
+import boto3
+
+QUEUE_NAME = os.environ.get('QUEUE_NAME')
+print('QUEUE_NAME ' + QUEUE_NAME)
+
+if __name__ == '__main__':
+ try:
+ client = boto3.client('sqs')
+ queue_url = client.get_queue_url(QueueName=QUEUE_NAME)['QueueUrl']
+ print('queue_url ' + queue_url)
+ while True:
+ response = client.receive_message(
+ QueueUrl=queue_url,
+ WaitTimeSeconds=10,
+ )
+ if response and 'Messages' in response:
+ for msg in response['Messages']:
+ print(msg['Body'])
+ entries = [{'Id': x['MessageId'], 'ReceiptHandle': x['ReceiptHandle']} for x in response['Messages']]
+ client.delete_message_batch(QueueUrl=queue_url, Entries=entries)
+
+ with open('/tmp/health_status', 'w') as f:
+ f.write('1')
+ except Exception as e:
+ with open('/tmp/health_status', 'w') as f:
+ f.write('0')
+ raise e
+
+
+
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/asset.8be39d348c20f7e58a373abbd1152069e18da130e51bf52c89bd82a38d0e51d7/Dockerfile b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/asset.8be39d348c20f7e58a373abbd1152069e18da130e51bf52c89bd82a38d0e51d7/Dockerfile
deleted file mode 100644
index cb97d79b264ce..0000000000000
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/asset.8be39d348c20f7e58a373abbd1152069e18da130e51bf52c89bd82a38d0e51d7/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM public.ecr.aws/lambda/python:3.6
-
-RUN pip3 install boto3
-
-ENV QUEUE_NAME $QUEUE_NAME
-
-WORKDIR /src
-ADD . /src
-
-ENTRYPOINT ["python3","index.py"]
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/asset.8be39d348c20f7e58a373abbd1152069e18da130e51bf52c89bd82a38d0e51d7/index.py b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/asset.8be39d348c20f7e58a373abbd1152069e18da130e51bf52c89bd82a38d0e51d7/index.py
deleted file mode 100644
index 8b53f5149cb24..0000000000000
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/asset.8be39d348c20f7e58a373abbd1152069e18da130e51bf52c89bd82a38d0e51d7/index.py
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/python
-import os
-import boto3
-
-QUEUE_NAME = os.environ.get('QUEUE_NAME')
-print('QUEUE_NAME ' + QUEUE_NAME)
-
-if __name__ == '__main__':
- client = boto3.client('sqs')
- queue_url = client.get_queue_url(QueueName=QUEUE_NAME)['QueueUrl']
- print('queue_url ' + queue_url)
- while True:
- response = client.receive_message(
- QueueUrl=queue_url,
- WaitTimeSeconds=10,
- )
- if response and 'Messages' in response:
- for msg in response['Messages']:
- print(msg['Body'])
- entries = [{'Id': x['MessageId'], 'ReceiptHandle': x['ReceiptHandle']} for x in response['Messages']]
- client.delete_message_batch(QueueUrl=queue_url, Entries=entries)
-
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/aws-ecs-patterns-queue-no-cpu-scaling.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/aws-ecs-patterns-queue-no-cpu-scaling.assets.json
index 9b1b4c087badb..b7739084afdf1 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/aws-ecs-patterns-queue-no-cpu-scaling.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/aws-ecs-patterns-queue-no-cpu-scaling.assets.json
@@ -1,29 +1,31 @@
{
- "version": "35.0.0",
+ "version": "45.0.0",
"files": {
- "ed04a572a615b5b3c73d8d5a4f2ec2099e056827facc63c4cfe504e6d0640065": {
+ "e641dd4706775930bb4793a7c28da5dac69ffbfeebac3831654bfca3ab649e32": {
+ "displayName": "aws-ecs-patterns-queue-no-cpu-scaling Template",
"source": {
"path": "aws-ecs-patterns-queue-no-cpu-scaling.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-59b07338": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "ed04a572a615b5b3c73d8d5a4f2ec2099e056827facc63c4cfe504e6d0640065.json",
+ "objectKey": "e641dd4706775930bb4793a7c28da5dac69ffbfeebac3831654bfca3ab649e32.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
}
},
"dockerImages": {
- "8be39d348c20f7e58a373abbd1152069e18da130e51bf52c89bd82a38d0e51d7": {
+ "205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03": {
+ "displayName": "aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage",
"source": {
- "directory": "asset.8be39d348c20f7e58a373abbd1152069e18da130e51bf52c89bd82a38d0e51d7"
+ "directory": "asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-b26f3a33": {
"repositoryName": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}",
- "imageTag": "8be39d348c20f7e58a373abbd1152069e18da130e51bf52c89bd82a38d0e51d7",
+ "imageTag": "205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-image-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/aws-ecs-patterns-queue-no-cpu-scaling.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/aws-ecs-patterns-queue-no-cpu-scaling.template.json
index e51ffe313577c..c78a93a9bb9a4 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/aws-ecs-patterns-queue-no-cpu-scaling.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/aws-ecs-patterns-queue-no-cpu-scaling.template.json
@@ -482,7 +482,7 @@
],
"Essential": true,
"Image": {
- "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:8be39d348c20f7e58a373abbd1152069e18da130e51bf52c89bd82a38d0e51d7"
+ "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03"
},
"LogConfiguration": {
"LogDriver": "awslogs",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/cdk.out
index c5cb2e5de6344..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"35.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/integ.json
index 5c6b7a7613422..1de22cede6f0f 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "35.0.0",
+ "version": "45.0.0",
"testCases": {
"noCpuScalingQueueProcessingFargateServiceTest/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "noCpuScalingQueueProcessingFargateServiceTest/DefaultTest/DeployAssert",
"assertionStackName": "noCpuScalingQueueProcessingFargateServiceTestDefaultTestDeployAssertE4E4F855"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/manifest.json
index c451d067ffd06..5ad1254d62ad7 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "35.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-patterns-queue-no-cpu-scaling.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/ed04a572a615b5b3c73d8d5a4f2ec2099e056827facc63c4cfe504e6d0640065.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/e641dd4706775930bb4793a7c28da5dac69ffbfeebac3831654bfca3ab649e32.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -34,12 +34,56 @@
"aws-ecs-patterns-queue-no-cpu-scaling.assets"
],
"metadata": {
+ "/aws-ecs-patterns-queue-no-cpu-scaling/VPC": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "restrictDefaultSecurityGroup": false
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/VPC/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "VPCB9E5F0B4"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/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": [
+ "*"
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -76,6 +120,42 @@
"data": "VPCPublicSubnet1NATGatewayE0556630"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/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": [
+ "*"
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -112,6 +192,34 @@
"data": "VPCPublicSubnet2NATGateway3C070193"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/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": {}
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -136,6 +244,34 @@
"data": "VPCPrivateSubnet1DefaultRouteAE1D6490"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/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": {}
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet2/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -172,12 +308,32 @@
"data": "VPCVPCGW99B986DC"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/EcsProcessingDeadLetterQueue": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "retentionPeriod": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/EcsProcessingDeadLetterQueue/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "awsecspatternsqueuenocpuscalingEcsProcessingDeadLetterQueue00A254F5"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/EcsProcessingQueue": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "visibilityTimeout": "*",
+ "deadLetterQueue": {
+ "queue": "*",
+ "maxReceiveCount": "*"
+ }
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/EcsProcessingQueue/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -208,12 +364,105 @@
"data": "awsecspatternsqueuenocpuscalingSQSQueueArn07A31821"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ }
+ ],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/TaskRole": [
+ {
+ "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": [
+ "*"
+ ]
+ }
+ }
+ ],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/TaskRole/ImportTaskRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/TaskRole/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "awsecspatternsqueuenocpuscalingQueueProcessingTaskDefTaskRole32D98F08"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/TaskRole/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": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/TaskRole/DefaultPolicy/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -226,36 +475,213 @@
"data": "awsecspatternsqueuenocpuscalingQueueProcessingTaskDef33911003"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "retention": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "awsecspatternsqueuenocpuscalingQueueProcessingTaskDefQueueProcessingContainerLogGroupD037396C"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/ExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "assumedBy": {
+ "principalAccount": "*",
+ "assumeRoleAction": "*"
+ },
+ "roleName": "*"
+ }
+ },
+ {
+ "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": [
+ {}
+ ]
+ }
+ }
+ ],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/ExecutionRole/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "awsecspatternsqueuenocpuscalingQueueProcessingTaskDefExecutionRole7DE7E444"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/ExecutionRole/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": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "awsecspatternsqueuenocpuscalingQueueProcessingTaskDefExecutionRoleDefaultPolicyDE7E0B22"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService": [
+ {
+ "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": "*"
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/Service": [
{
"type": "aws:cdk:logicalId",
"data": "awsecspatternsqueuenocpuscalingQueueProcessingFargateService2D3CD1AE"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/SecurityGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/SecurityGroup/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceSecurityGroupE40A7C91"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/ScalingRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "serviceNamespace": "ecs",
+ "scalableDimension": "*",
+ "resourceId": "*",
+ "role": "*",
+ "minCapacity": "*",
+ "maxCapacity": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "scaleOnMetric": [
+ "*",
+ {
+ "metric": {
+ "warnings": "*"
+ },
+ "scalingSteps": [
+ {
+ "upper": "*",
+ "change": "*"
+ },
+ {
+ "lower": "*",
+ "change": "*"
+ },
+ {
+ "lower": "*",
+ "change": "*"
+ }
+ ],
+ "cooldown": "*"
+ }
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -268,6 +694,29 @@
"data": "awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy0A2D0ED3"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "metric": {
+ "warnings": "*"
+ },
+ "alarmDescription": "*",
+ "comparisonOperator": "*",
+ "evaluationPeriods": "*",
+ "datapointsToAlarm": "*",
+ "threshold": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addAlarmAction": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -280,12 +729,43 @@
"data": "awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy33179C1A"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "metric": {
+ "warnings": "*"
+ },
+ "alarmDescription": "*",
+ "comparisonOperator": "*",
+ "evaluationPeriods": "*",
+ "datapointsToAlarm": "*",
+ "threshold": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addAlarmAction": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperAlarm10D3781E"
}
],
+ "/aws-ecs-patterns-queue-no-cpu-scaling/EcsDefaultClusterMnL3mNNYNVPC": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queue-no-cpu-scaling/EcsDefaultClusterMnL3mNNYNVPC/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -360,6 +840,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/noCpuScalingQueueProcessingFargateServiceTestDefaultTestDeployAssertE4E4F855.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/noCpuScalingQueueProcessingFargateServiceTestDefaultTestDeployAssertE4E4F855.assets.json
index d9f2ddf190f88..b154e3976e093 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/noCpuScalingQueueProcessingFargateServiceTestDefaultTestDeployAssertE4E4F855.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/noCpuScalingQueueProcessingFargateServiceTestDefaultTestDeployAssertE4E4F855.assets.json
@@ -1,13 +1,14 @@
{
- "version": "35.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "noCpuScalingQueueProcessingFargateServiceTestDefaultTestDeployAssertE4E4F855 Template",
"source": {
"path": "noCpuScalingQueueProcessingFargateServiceTestDefaultTestDeployAssertE4E4F855.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/tree.json
index 721af65a60822..5b54c17367cbf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-no-cpu-scaling.js.snapshot/tree.json
@@ -1,1574 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-patterns-queue-no-cpu-scaling": {
- "id": "aws-ecs-patterns-queue-no-cpu-scaling",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling",
- "children": {
- "VPC": {
- "id": "VPC",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/Resource",
- "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-ecs-patterns-queue-no-cpu-scaling/VPC"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1/Subnet",
- "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-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPublicSubnet1RouteTableFEE4B781"
- },
- "subnetId": {
- "Ref": "VPCPublicSubnet1SubnetB4246D30"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "routeTableId": {
- "Ref": "VPCPublicSubnet1RouteTableFEE4B781"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1/NATGateway",
- "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-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
- "version": "0.0.0"
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2/Subnet",
- "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-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPublicSubnet2RouteTable6F1A15F1"
- },
- "subnetId": {
- "Ref": "VPCPublicSubnet2Subnet74179F39"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "routeTableId": {
- "Ref": "VPCPublicSubnet2RouteTable6F1A15F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2/NATGateway",
- "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-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
- "version": "0.0.0"
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet1/Subnet",
- "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-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPrivateSubnet1RouteTableBE8A6027"
- },
- "subnetId": {
- "Ref": "VPCPrivateSubnet1Subnet8BCA10E0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VPCPublicSubnet1NATGatewayE0556630"
- },
- "routeTableId": {
- "Ref": "VPCPrivateSubnet1RouteTableBE8A6027"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
- "version": "0.0.0"
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet2/Subnet",
- "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-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPrivateSubnet2RouteTable0A19E10E"
- },
- "subnetId": {
- "Ref": "VPCPrivateSubnet2SubnetCFCDAA7A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VPCPublicSubnet2NATGateway3C070193"
- },
- "routeTableId": {
- "Ref": "VPCPrivateSubnet2RouteTable0A19E10E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
- "version": "0.0.0"
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queue-no-cpu-scaling/VPC"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/VPC/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0"
- }
- },
- "aws-ecs-patterns-queue-no-cpu-scaling": {
- "id": "aws-ecs-patterns-queue-no-cpu-scaling",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling",
- "children": {
- "EcsProcessingDeadLetterQueue": {
- "id": "EcsProcessingDeadLetterQueue",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/EcsProcessingDeadLetterQueue",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/EcsProcessingDeadLetterQueue/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SQS::Queue",
- "aws:cdk:cloudformation:props": {
- "messageRetentionPeriod": 1209600
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.CfnQueue",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.Queue",
- "version": "0.0.0"
- }
- },
- "EcsProcessingQueue": {
- "id": "EcsProcessingQueue",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/EcsProcessingQueue",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/EcsProcessingQueue/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SQS::Queue",
- "aws:cdk:cloudformation:props": {
- "redrivePolicy": {
- "deadLetterTargetArn": {
- "Fn::GetAtt": [
- "awsecspatternsqueuenocpuscalingEcsProcessingDeadLetterQueue00A254F5",
- "Arn"
- ]
- },
- "maxReceiveCount": 3
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.CfnQueue",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.Queue",
- "version": "0.0.0"
- }
- },
- "SQSDeadLetterQueue": {
- "id": "SQSDeadLetterQueue",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/SQSDeadLetterQueue",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "SQSDeadLetterQueueArn": {
- "id": "SQSDeadLetterQueueArn",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/SQSDeadLetterQueueArn",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "SQSQueue": {
- "id": "SQSQueue",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/SQSQueue",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "SQSQueueArn": {
- "id": "SQSQueueArn",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/SQSQueueArn",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "QueueProcessingTaskDef": {
- "id": "QueueProcessingTaskDef",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/TaskRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/TaskRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "sqs:ChangeMessageVisibility",
- "sqs:DeleteMessage",
- "sqs:GetQueueAttributes",
- "sqs:GetQueueUrl",
- "sqs:ReceiveMessage"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "awsecspatternsqueuenocpuscalingEcsProcessingQueue52AE8DE5",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "awsecspatternsqueuenocpuscalingQueueProcessingTaskDefTaskRoleDefaultPolicy07A2DF7A",
- "roles": [
- {
- "Ref": "awsecspatternsqueuenocpuscalingQueueProcessingTaskDefTaskRole32D98F08"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": {
- "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:8be39d348c20f7e58a373abbd1152069e18da130e51bf52c89bd82a38d0e51d7"
- },
- "name": "QueueProcessingContainer",
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": {
- "Ref": "awsecspatternsqueuenocpuscalingQueueProcessingTaskDefQueueProcessingContainerLogGroupD037396C"
- },
- "awslogs-stream-prefix": "aws-ecs-patterns-queue-no-cpu-scaling",
- "awslogs-region": {
- "Ref": "AWS::Region"
- }
- }
- },
- "environment": [
- {
- "name": "QUEUE_NAME",
- "value": {
- "Fn::GetAtt": [
- "awsecspatternsqueuenocpuscalingEcsProcessingQueue52AE8DE5",
- "QueueName"
- ]
- }
- }
- ]
- }
- ],
- "cpu": "256",
- "executionRoleArn": {
- "Fn::GetAtt": [
- "awsecspatternsqueuenocpuscalingQueueProcessingTaskDefExecutionRole7DE7E444",
- "Arn"
- ]
- },
- "family": "awsecspatternsqueuenocpuscalingQueueProcessingTaskDef737B9146",
- "memory": "512",
- "networkMode": "awsvpc",
- "requiresCompatibilities": [
- "FARGATE"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "awsecspatternsqueuenocpuscalingQueueProcessingTaskDefTaskRole32D98F08",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "QueueProcessingContainer": {
- "id": "QueueProcessingContainer",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/QueueProcessingContainer",
- "children": {
- "AssetImage": {
- "id": "AssetImage",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage",
- "children": {
- "Staging": {
- "id": "Staging",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Staging",
- "constructInfo": {
- "fqn": "aws-cdk-lib.AssetStaging",
- "version": "0.0.0"
- }
- },
- "Repository": {
- "id": "Repository",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Repository",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset",
- "version": "0.0.0"
- }
- },
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "ecr:BatchCheckLayerAvailability",
- "ecr:BatchGetImage",
- "ecr:GetDownloadUrlForLayer"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecr:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":repository/",
- {
- "Fn::Sub": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"
- }
- ]
- ]
- }
- },
- {
- "Action": "ecr:GetAuthorizationToken",
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "awsecspatternsqueuenocpuscalingQueueProcessingTaskDefQueueProcessingContainerLogGroupD037396C",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "awsecspatternsqueuenocpuscalingQueueProcessingTaskDefExecutionRoleDefaultPolicyDE7E0B22",
- "roles": [
- {
- "Ref": "awsecspatternsqueuenocpuscalingQueueProcessingTaskDefExecutionRole7DE7E444"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.FargateTaskDefinition",
- "version": "0.0.0"
- }
- },
- "QueueProcessingFargateService": {
- "id": "QueueProcessingFargateService",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50,
- "alarms": {
- "alarmNames": [],
- "enable": false,
- "rollback": false
- }
- },
- "enableEcsManagedTags": false,
- "launchType": "FARGATE",
- "networkConfiguration": {
- "awsvpcConfiguration": {
- "assignPublicIp": "ENABLED",
- "subnets": [
- {
- "Ref": "VPCPublicSubnet1SubnetB4246D30"
- },
- {
- "Ref": "VPCPublicSubnet2Subnet74179F39"
- }
- ],
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceSecurityGroupE40A7C91",
- "GroupId"
- ]
- }
- ]
- }
- },
- "taskDefinition": {
- "Ref": "awsecspatternsqueuenocpuscalingQueueProcessingTaskDef33911003"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/SecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0"
- }
- },
- "ScalingRole": {
- "id": "ScalingRole",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/ScalingRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "TaskCount": {
- "id": "TaskCount",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount",
- "children": {
- "Target": {
- "id": "Target",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ApplicationAutoScaling::ScalableTarget",
- "aws:cdk:cloudformation:props": {
- "maxCapacity": 2,
- "minCapacity": 1,
- "resourceId": {
- "Fn::Join": [
- "",
- [
- "service/",
- {
- "Ref": "EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"
- },
- "/",
- {
- "Fn::GetAtt": [
- "awsecspatternsqueuenocpuscalingQueueProcessingFargateService2D3CD1AE",
- "Name"
- ]
- }
- ]
- ]
- },
- "roleArn": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":iam::",
- {
- "Ref": "AWS::AccountId"
- },
- ":role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService"
- ]
- ]
- },
- "scalableDimension": "ecs:service:DesiredCount",
- "serviceNamespace": "ecs"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.CfnScalableTarget",
- "version": "0.0.0"
- }
- },
- "QueueMessagesVisibleScaling": {
- "id": "QueueMessagesVisibleScaling",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling",
- "children": {
- "LowerPolicy": {
- "id": "LowerPolicy",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ApplicationAutoScaling::ScalingPolicy",
- "aws:cdk:cloudformation:props": {
- "policyName": "awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicyC9FD3BAC",
- "policyType": "StepScaling",
- "scalingTargetId": {
- "Ref": "awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceTaskCountTargetAF622EF9"
- },
- "stepScalingPolicyConfiguration": {
- "adjustmentType": "ChangeInCapacity",
- "metricAggregationType": "Maximum",
- "stepAdjustments": [
- {
- "metricIntervalUpperBound": 0,
- "scalingAdjustment": -1
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.StepScalingAction",
- "version": "0.0.0"
- }
- },
- "LowerAlarm": {
- "id": "LowerAlarm",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::CloudWatch::Alarm",
- "aws:cdk:cloudformation:props": {
- "alarmActions": [
- {
- "Ref": "awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy0A2D0ED3"
- }
- ],
- "alarmDescription": "Lower threshold scaling alarm",
- "comparisonOperator": "LessThanOrEqualToThreshold",
- "dimensions": [
- {
- "name": "QueueName",
- "value": {
- "Fn::GetAtt": [
- "awsecspatternsqueuenocpuscalingEcsProcessingQueue52AE8DE5",
- "QueueName"
- ]
- }
- }
- ],
- "evaluationPeriods": 1,
- "metricName": "ApproximateNumberOfMessagesVisible",
- "namespace": "AWS/SQS",
- "period": 300,
- "statistic": "Maximum",
- "threshold": 0
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.CfnAlarm",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.Alarm",
- "version": "0.0.0"
- }
- },
- "UpperPolicy": {
- "id": "UpperPolicy",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ApplicationAutoScaling::ScalingPolicy",
- "aws:cdk:cloudformation:props": {
- "policyName": "awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy2230072F",
- "policyType": "StepScaling",
- "scalingTargetId": {
- "Ref": "awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceTaskCountTargetAF622EF9"
- },
- "stepScalingPolicyConfiguration": {
- "adjustmentType": "ChangeInCapacity",
- "metricAggregationType": "Maximum",
- "stepAdjustments": [
- {
- "metricIntervalLowerBound": 0,
- "metricIntervalUpperBound": 400,
- "scalingAdjustment": 1
- },
- {
- "metricIntervalLowerBound": 400,
- "scalingAdjustment": 5
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.StepScalingAction",
- "version": "0.0.0"
- }
- },
- "UpperAlarm": {
- "id": "UpperAlarm",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::CloudWatch::Alarm",
- "aws:cdk:cloudformation:props": {
- "alarmActions": [
- {
- "Ref": "awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy33179C1A"
- }
- ],
- "alarmDescription": "Upper threshold scaling alarm",
- "comparisonOperator": "GreaterThanOrEqualToThreshold",
- "dimensions": [
- {
- "name": "QueueName",
- "value": {
- "Fn::GetAtt": [
- "awsecspatternsqueuenocpuscalingEcsProcessingQueue52AE8DE5",
- "QueueName"
- ]
- }
- }
- ],
- "evaluationPeriods": 1,
- "metricName": "ApproximateNumberOfMessagesVisible",
- "namespace": "AWS/SQS",
- "period": 300,
- "statistic": "Maximum",
- "threshold": 100
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.CfnAlarm",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.Alarm",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.StepScalingPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.ScalableTarget",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ScalableTaskCount",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.FargateService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs_patterns.QueueProcessingFargateService",
- "version": "0.0.0"
- }
- },
- "EcsDefaultClusterMnL3mNNYNVPC": {
- "id": "EcsDefaultClusterMnL3mNNYNVPC",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/EcsDefaultClusterMnL3mNNYNVPC",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/EcsDefaultClusterMnL3mNNYNVPC/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-patterns-queue-no-cpu-scaling/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "noCpuScalingQueueProcessingFargateServiceTest": {
- "id": "noCpuScalingQueueProcessingFargateServiceTest",
- "path": "noCpuScalingQueueProcessingFargateServiceTest",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "noCpuScalingQueueProcessingFargateServiceTest/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "noCpuScalingQueueProcessingFargateServiceTest/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.3.0"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "noCpuScalingQueueProcessingFargateServiceTest/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "noCpuScalingQueueProcessingFargateServiceTest/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "noCpuScalingQueueProcessingFargateServiceTest/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.3.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-patterns-queue-no-cpu-scaling":{"id":"aws-ecs-patterns-queue-no-cpu-scaling","path":"aws-ecs-patterns-queue-no-cpu-scaling","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"VPC":{"id":"VPC","path":"aws-ecs-patterns-queue-no-cpu-scaling/VPC","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/VPC"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/VPC/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/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-ecs-patterns-queue-no-cpu-scaling/VPC"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-patterns-queue-no-cpu-scaling/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"}}}}}},"aws-ecs-patterns-queue-no-cpu-scaling":{"id":"aws-ecs-patterns-queue-no-cpu-scaling","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.QueueProcessingFargateService","version":"0.0.0"},"children":{"EcsProcessingDeadLetterQueue":{"id":"EcsProcessingDeadLetterQueue","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/EcsProcessingDeadLetterQueue","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.Queue","version":"0.0.0","metadata":[{"retentionPeriod":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/EcsProcessingDeadLetterQueue/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueue","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::Queue","aws:cdk:cloudformation:props":{"messageRetentionPeriod":1209600}}}}},"EcsProcessingQueue":{"id":"EcsProcessingQueue","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/EcsProcessingQueue","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.Queue","version":"0.0.0","metadata":[{"visibilityTimeout":"*","deadLetterQueue":{"queue":"*","maxReceiveCount":"*"}}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/EcsProcessingQueue/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueue","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::Queue","aws:cdk:cloudformation:props":{"redrivePolicy":{"deadLetterTargetArn":{"Fn::GetAtt":["awsecspatternsqueuenocpuscalingEcsProcessingDeadLetterQueue00A254F5","Arn"]},"maxReceiveCount":3}}}}}},"SQSDeadLetterQueue":{"id":"SQSDeadLetterQueue","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/SQSDeadLetterQueue","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSDeadLetterQueueArn":{"id":"SQSDeadLetterQueueArn","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/SQSDeadLetterQueueArn","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSQueue":{"id":"SQSQueue","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/SQSQueue","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSQueueArn":{"id":"SQSQueueArn","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/SQSQueueArn","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"QueueProcessingTaskDef":{"id":"QueueProcessingTaskDef","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateTaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/TaskRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/TaskRole/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":["sqs:ChangeMessageVisibility","sqs:DeleteMessage","sqs:GetQueueAttributes","sqs:GetQueueUrl","sqs:ReceiveMessage"],"Effect":"Allow","Resource":{"Fn::GetAtt":["awsecspatternsqueuenocpuscalingEcsProcessingQueue52AE8DE5","Arn"]}}],"Version":"2012-10-17"},"policyName":"awsecspatternsqueuenocpuscalingQueueProcessingTaskDefTaskRoleDefaultPolicy07A2DF7A","roles":[{"Ref":"awsecspatternsqueuenocpuscalingQueueProcessingTaskDefTaskRole32D98F08"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/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":{"Fn::Sub":"${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03"},"name":"QueueProcessingContainer","logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"awsecspatternsqueuenocpuscalingQueueProcessingTaskDefQueueProcessingContainerLogGroupD037396C"},"awslogs-stream-prefix":"aws-ecs-patterns-queue-no-cpu-scaling","awslogs-region":{"Ref":"AWS::Region"}}},"environment":[{"name":"QUEUE_NAME","value":{"Fn::GetAtt":["awsecspatternsqueuenocpuscalingEcsProcessingQueue52AE8DE5","QueueName"]}}]}],"cpu":"256","executionRoleArn":{"Fn::GetAtt":["awsecspatternsqueuenocpuscalingQueueProcessingTaskDefExecutionRole7DE7E444","Arn"]},"family":"awsecspatternsqueuenocpuscalingQueueProcessingTaskDef737B9146","memory":"512","networkMode":"awsvpc","requiresCompatibilities":["FARGATE"],"taskRoleArn":{"Fn::GetAtt":["awsecspatternsqueuenocpuscalingQueueProcessingTaskDefTaskRole32D98F08","Arn"]}}}},"QueueProcessingContainer":{"id":"QueueProcessingContainer","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/QueueProcessingContainer","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"AssetImage":{"id":"AssetImage","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr_assets.DockerImageAsset","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Repository":{"id":"Repository","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Repository","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr.RepositoryBase","version":"0.0.0","metadata":[]}}}},"LogGroup":{"id":"LogGroup","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/ExecutionRole/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-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingTaskDef/ExecutionRole/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":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Fn::Sub":"cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"}]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"},{"Action":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["awsecspatternsqueuenocpuscalingQueueProcessingTaskDefQueueProcessingContainerLogGroupD037396C","Arn"]}}],"Version":"2012-10-17"},"policyName":"awsecspatternsqueuenocpuscalingQueueProcessingTaskDefExecutionRoleDefaultPolicyDE7E0B22","roles":[{"Ref":"awsecspatternsqueuenocpuscalingQueueProcessingTaskDefExecutionRole7DE7E444"}]}}}}}}}}},"QueueProcessingFargateService":{"id":"QueueProcessingFargateService","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateService","version":"0.0.0","metadata":["*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/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":"EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50,"alarms":{"alarmNames":[],"enable":false,"rollback":false}},"enableEcsManagedTags":false,"launchType":"FARGATE","networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"ENABLED","subnets":[{"Ref":"VPCPublicSubnet1SubnetB4246D30"},{"Ref":"VPCPublicSubnet2Subnet74179F39"}],"securityGroups":[{"Fn::GetAtt":["awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceSecurityGroupE40A7C91","GroupId"]}]}},"taskDefinition":{"Ref":"awsecspatternsqueuenocpuscalingQueueProcessingTaskDef33911003"}}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/SecurityGroup/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-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"ScalingRole":{"id":"ScalingRole","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/ScalingRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"TaskCount":{"id":"TaskCount","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ScalableTaskCount","version":"0.0.0"},"children":{"Target":{"id":"Target","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.ScalableTarget","version":"0.0.0","metadata":[{"serviceNamespace":"ecs","scalableDimension":"*","resourceId":"*","role":"*","minCapacity":"*","maxCapacity":"*"},{"scaleOnMetric":["*",{"metric":{"warnings":"*"},"scalingSteps":[{"upper":"*","change":"*"},{"lower":"*","change":"*"},{"lower":"*","change":"*"}],"cooldown":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalableTarget","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalableTarget","aws:cdk:cloudformation:props":{"maxCapacity":2,"minCapacity":1,"resourceId":{"Fn::Join":["",["service/",{"Ref":"EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"},"/",{"Fn::GetAtt":["awsecspatternsqueuenocpuscalingQueueProcessingFargateService2D3CD1AE","Name"]}]]},"roleArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::",{"Ref":"AWS::AccountId"},":role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService"]]},"scalableDimension":"ecs:service:DesiredCount","serviceNamespace":"ecs"}}},"QueueMessagesVisibleScaling":{"id":"QueueMessagesVisibleScaling","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingPolicy","version":"0.0.0"},"children":{"LowerPolicy":{"id":"LowerPolicy","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingAction","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicyC9FD3BAC","policyType":"StepScaling","scalingTargetId":{"Ref":"awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceTaskCountTargetAF622EF9"},"stepScalingPolicyConfiguration":{"adjustmentType":"ChangeInCapacity","metricAggregationType":"Maximum","stepAdjustments":[{"metricIntervalUpperBound":0,"scalingAdjustment":-1}]}}}}}},"LowerAlarm":{"id":"LowerAlarm","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.Alarm","version":"0.0.0","metadata":[{"metric":{"warnings":"*"},"alarmDescription":"*","comparisonOperator":"*","evaluationPeriods":"*","datapointsToAlarm":"*","threshold":"*"},{"addAlarmAction":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.CfnAlarm","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CloudWatch::Alarm","aws:cdk:cloudformation:props":{"alarmActions":[{"Ref":"awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy0A2D0ED3"}],"alarmDescription":"Lower threshold scaling alarm","comparisonOperator":"LessThanOrEqualToThreshold","dimensions":[{"name":"QueueName","value":{"Fn::GetAtt":["awsecspatternsqueuenocpuscalingEcsProcessingQueue52AE8DE5","QueueName"]}}],"evaluationPeriods":1,"metricName":"ApproximateNumberOfMessagesVisible","namespace":"AWS/SQS","period":300,"statistic":"Maximum","threshold":0}}}}},"UpperPolicy":{"id":"UpperPolicy","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingAction","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy2230072F","policyType":"StepScaling","scalingTargetId":{"Ref":"awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceTaskCountTargetAF622EF9"},"stepScalingPolicyConfiguration":{"adjustmentType":"ChangeInCapacity","metricAggregationType":"Maximum","stepAdjustments":[{"metricIntervalLowerBound":0,"metricIntervalUpperBound":400,"scalingAdjustment":1},{"metricIntervalLowerBound":400,"scalingAdjustment":5}]}}}}}},"UpperAlarm":{"id":"UpperAlarm","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.Alarm","version":"0.0.0","metadata":[{"metric":{"warnings":"*"},"alarmDescription":"*","comparisonOperator":"*","evaluationPeriods":"*","datapointsToAlarm":"*","threshold":"*"},{"addAlarmAction":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-no-cpu-scaling/aws-ecs-patterns-queue-no-cpu-scaling/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.CfnAlarm","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CloudWatch::Alarm","aws:cdk:cloudformation:props":{"alarmActions":[{"Ref":"awsecspatternsqueuenocpuscalingQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy33179C1A"}],"alarmDescription":"Upper threshold scaling alarm","comparisonOperator":"GreaterThanOrEqualToThreshold","dimensions":[{"name":"QueueName","value":{"Fn::GetAtt":["awsecspatternsqueuenocpuscalingEcsProcessingQueue52AE8DE5","QueueName"]}}],"evaluationPeriods":1,"metricName":"ApproximateNumberOfMessagesVisible","namespace":"AWS/SQS","period":300,"statistic":"Maximum","threshold":100}}}}}}}}}}}}}}},"EcsDefaultClusterMnL3mNNYNVPC":{"id":"EcsDefaultClusterMnL3mNNYNVPC","path":"aws-ecs-patterns-queue-no-cpu-scaling/EcsDefaultClusterMnL3mNNYNVPC","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-no-cpu-scaling/EcsDefaultClusterMnL3mNNYNVPC/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":{}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-patterns-queue-no-cpu-scaling/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-patterns-queue-no-cpu-scaling/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"noCpuScalingQueueProcessingFargateServiceTest":{"id":"noCpuScalingQueueProcessingFargateServiceTest","path":"noCpuScalingQueueProcessingFargateServiceTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"noCpuScalingQueueProcessingFargateServiceTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"noCpuScalingQueueProcessingFargateServiceTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"noCpuScalingQueueProcessingFargateServiceTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"noCpuScalingQueueProcessingFargateServiceTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"noCpuScalingQueueProcessingFargateServiceTest/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-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/aws-ecs-patterns-queu-no-cooldown.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/aws-ecs-patterns-queu-no-cooldown.assets.json
index 71d65662cd95d..a4157c001d552 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/aws-ecs-patterns-queu-no-cooldown.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/aws-ecs-patterns-queu-no-cooldown.assets.json
@@ -1,13 +1,14 @@
{
- "version": "36.0.0",
+ "version": "45.0.0",
"files": {
"779cdfc2bc9052367bc182ec3202dbdcbcedebf5ac94a6296e121c057ec98cb5": {
+ "displayName": "aws-ecs-patterns-queu-no-cooldown Template",
"source": {
"path": "aws-ecs-patterns-queu-no-cooldown.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-b9c3e7b2": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
"objectKey": "779cdfc2bc9052367bc182ec3202dbdcbcedebf5ac94a6296e121c057ec98cb5.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
@@ -17,11 +18,12 @@
},
"dockerImages": {
"205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03": {
+ "displayName": "QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage",
"source": {
"directory": "asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-b26f3a33": {
"repositoryName": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}",
"imageTag": "205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-image-publishing-role-${AWS::AccountId}-${AWS::Region}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/cdk.out
index 1f0068d32659a..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"36.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/integ.json
index a664adcb86091..69bbd66626a0a 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "36.0.0",
+ "version": "45.0.0",
"testCases": {
"queueProcessingFargateServiceTest/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "queueProcessingFargateServiceTest/DefaultTest/DeployAssert",
"assertionStackName": "queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/manifest.json
index 6acfda605a233..280392ca998cf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "36.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-patterns-queu-no-cooldown.assets": {
"type": "cdk:asset-manifest",
@@ -34,12 +34,57 @@
"aws-ecs-patterns-queu-no-cooldown.assets"
],
"metadata": {
+ "/aws-ecs-patterns-queu-no-cooldown/VPC": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "restrictDefaultSecurityGroup": false,
+ "maxAzs": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/VPC/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "VPCB9E5F0B4"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/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": [
+ "*"
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -76,6 +121,42 @@
"data": "VPCPublicSubnet1NATGatewayE0556630"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/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": [
+ "*"
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -112,6 +193,34 @@
"data": "VPCPublicSubnet2NATGateway3C070193"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/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": {}
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -136,6 +245,34 @@
"data": "VPCPrivateSubnet1DefaultRouteAE1D6490"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/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": {}
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet2/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -172,12 +309,32 @@
"data": "VPCVPCGW99B986DC"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/EcsProcessingDeadLetterQueue": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "retentionPeriod": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/EcsProcessingDeadLetterQueue/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "QueueProcessingServiceEcsProcessingDeadLetterQueueD47A7C6B"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/EcsProcessingQueue": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "visibilityTimeout": "*",
+ "deadLetterQueue": {
+ "queue": "*",
+ "maxReceiveCount": "*"
+ }
+ }
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/EcsProcessingQueue/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -208,12 +365,105 @@
"data": "QueueProcessingServiceSQSQueueArn8C4AE4AE"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ }
+ ],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/TaskRole": [
+ {
+ "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": [
+ "*"
+ ]
+ }
+ }
+ ],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/TaskRole/ImportTaskRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/TaskRole/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "QueueProcessingServiceQueueProcessingTaskDefTaskRole782B79A6"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/TaskRole/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": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/TaskRole/DefaultPolicy/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -226,36 +476,228 @@
"data": "QueueProcessingServiceQueueProcessingTaskDef4982F68B"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "retention": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "QueueProcessingServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupCC92448A"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "assumedBy": {
+ "principalAccount": "*",
+ "assumeRoleAction": "*"
+ },
+ "roleName": "*"
+ }
+ },
+ {
+ "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": [
+ {}
+ ]
+ }
+ }
+ ],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "QueueProcessingServiceQueueProcessingTaskDefExecutionRole37838985"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/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": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "QueueProcessingServiceQueueProcessingTaskDefExecutionRoleDefaultPolicyA83D332D"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService": [
+ {
+ "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": "*"
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/Service": [
{
"type": "aws:cdk:logicalId",
"data": "QueueProcessingServiceQueueProcessingFargateService0340DB9F"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/SecurityGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/SecurityGroup/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "QueueProcessingServiceQueueProcessingFargateServiceSecurityGroup8FDF413D"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/ScalingRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "serviceNamespace": "ecs",
+ "scalableDimension": "*",
+ "resourceId": "*",
+ "role": "*",
+ "minCapacity": "*",
+ "maxCapacity": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "scaleToTrackMetric": [
+ "*",
+ {
+ "predefinedMetric": "*",
+ "policyName": "*",
+ "disableScaleIn": "*",
+ "targetValue": "*",
+ "scaleInCooldown": "*"
+ }
+ ]
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "scaleOnMetric": [
+ "*",
+ {
+ "metric": {
+ "warnings": "*"
+ },
+ "scalingSteps": [
+ {
+ "upper": "*",
+ "change": "*"
+ },
+ {
+ "lower": "*",
+ "change": "*"
+ },
+ {
+ "lower": "*",
+ "change": "*"
+ }
+ ],
+ "cooldown": "*"
+ }
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -274,6 +716,29 @@
"data": "QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy332E2644"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "metric": {
+ "warnings": "*"
+ },
+ "alarmDescription": "*",
+ "comparisonOperator": "*",
+ "evaluationPeriods": "*",
+ "datapointsToAlarm": "*",
+ "threshold": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addAlarmAction": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -286,12 +751,43 @@
"data": "QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy84DD739A"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "metric": {
+ "warnings": "*"
+ },
+ "alarmDescription": "*",
+ "comparisonOperator": "*",
+ "evaluationPeriods": "*",
+ "datapointsToAlarm": "*",
+ "threshold": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addAlarmAction": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperAlarm2660BEDF"
}
],
+ "/aws-ecs-patterns-queu-no-cooldown/EcsDefaultClusterMnL3mNNYNVPC": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ }
+ ],
"/aws-ecs-patterns-queu-no-cooldown/EcsDefaultClusterMnL3mNNYNVPC/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -366,6 +862,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.assets.json
index d424f5dedd7d0..9aaa23fcbe085 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.assets.json
@@ -1,13 +1,14 @@
{
- "version": "36.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6 Template",
"source": {
"path": "queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/tree.json
index e70c625f82445..e32bb8c7f6962 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-task-definition-with-cooldown.js.snapshot/tree.json
@@ -1,1610 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-patterns-queu-no-cooldown": {
- "id": "aws-ecs-patterns-queu-no-cooldown",
- "path": "aws-ecs-patterns-queu-no-cooldown",
- "children": {
- "VPC": {
- "id": "VPC",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/Resource",
- "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-ecs-patterns-queu-no-cooldown/VPC"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1/Subnet",
- "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-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPublicSubnet1RouteTableFEE4B781"
- },
- "subnetId": {
- "Ref": "VPCPublicSubnet1SubnetB4246D30"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "routeTableId": {
- "Ref": "VPCPublicSubnet1RouteTableFEE4B781"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1/NATGateway",
- "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-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
- "version": "0.0.0"
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2/Subnet",
- "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-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPublicSubnet2RouteTable6F1A15F1"
- },
- "subnetId": {
- "Ref": "VPCPublicSubnet2Subnet74179F39"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "routeTableId": {
- "Ref": "VPCPublicSubnet2RouteTable6F1A15F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2/NATGateway",
- "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-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
- "version": "0.0.0"
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet1/Subnet",
- "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-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPrivateSubnet1RouteTableBE8A6027"
- },
- "subnetId": {
- "Ref": "VPCPrivateSubnet1Subnet8BCA10E0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VPCPublicSubnet1NATGatewayE0556630"
- },
- "routeTableId": {
- "Ref": "VPCPrivateSubnet1RouteTableBE8A6027"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
- "version": "0.0.0"
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet2/Subnet",
- "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-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPrivateSubnet2RouteTable0A19E10E"
- },
- "subnetId": {
- "Ref": "VPCPrivateSubnet2SubnetCFCDAA7A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VPCPublicSubnet2NATGateway3C070193"
- },
- "routeTableId": {
- "Ref": "VPCPrivateSubnet2RouteTable0A19E10E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
- "version": "0.0.0"
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-patterns-queu-no-cooldown/VPC"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-patterns-queu-no-cooldown/VPC/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0"
- }
- },
- "QueueProcessingService": {
- "id": "QueueProcessingService",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService",
- "children": {
- "EcsProcessingDeadLetterQueue": {
- "id": "EcsProcessingDeadLetterQueue",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/EcsProcessingDeadLetterQueue",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/EcsProcessingDeadLetterQueue/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SQS::Queue",
- "aws:cdk:cloudformation:props": {
- "messageRetentionPeriod": 1209600
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.CfnQueue",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.Queue",
- "version": "0.0.0"
- }
- },
- "EcsProcessingQueue": {
- "id": "EcsProcessingQueue",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/EcsProcessingQueue",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/EcsProcessingQueue/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SQS::Queue",
- "aws:cdk:cloudformation:props": {
- "redrivePolicy": {
- "deadLetterTargetArn": {
- "Fn::GetAtt": [
- "QueueProcessingServiceEcsProcessingDeadLetterQueueD47A7C6B",
- "Arn"
- ]
- },
- "maxReceiveCount": 3
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.CfnQueue",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.Queue",
- "version": "0.0.0"
- }
- },
- "SQSDeadLetterQueue": {
- "id": "SQSDeadLetterQueue",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/SQSDeadLetterQueue",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "SQSDeadLetterQueueArn": {
- "id": "SQSDeadLetterQueueArn",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/SQSDeadLetterQueueArn",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "SQSQueue": {
- "id": "SQSQueue",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/SQSQueue",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "SQSQueueArn": {
- "id": "SQSQueueArn",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/SQSQueueArn",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "QueueProcessingTaskDef": {
- "id": "QueueProcessingTaskDef",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/TaskRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/TaskRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "sqs:ChangeMessageVisibility",
- "sqs:DeleteMessage",
- "sqs:GetQueueAttributes",
- "sqs:GetQueueUrl",
- "sqs:ReceiveMessage"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "QueueProcessingServiceEcsProcessingQueue552F0B37",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "QueueProcessingServiceQueueProcessingTaskDefTaskRoleDefaultPolicyAE808B19",
- "roles": [
- {
- "Ref": "QueueProcessingServiceQueueProcessingTaskDefTaskRole782B79A6"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": {
- "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03"
- },
- "name": "QueueProcessingContainer",
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": {
- "Ref": "QueueProcessingServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupCC92448A"
- },
- "awslogs-stream-prefix": "QueueProcessingService",
- "awslogs-region": {
- "Ref": "AWS::Region"
- }
- }
- },
- "environment": [
- {
- "name": "QUEUE_NAME",
- "value": {
- "Fn::GetAtt": [
- "QueueProcessingServiceEcsProcessingQueue552F0B37",
- "QueueName"
- ]
- }
- }
- ]
- }
- ],
- "cpu": "256",
- "executionRoleArn": {
- "Fn::GetAtt": [
- "QueueProcessingServiceQueueProcessingTaskDefExecutionRole37838985",
- "Arn"
- ]
- },
- "family": "awsecspatternsqueunocooldownQueueProcessingServiceQueueProcessingTaskDefA90052F1",
- "memory": "512",
- "networkMode": "awsvpc",
- "requiresCompatibilities": [
- "FARGATE"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "QueueProcessingServiceQueueProcessingTaskDefTaskRole782B79A6",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "QueueProcessingContainer": {
- "id": "QueueProcessingContainer",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer",
- "children": {
- "AssetImage": {
- "id": "AssetImage",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage",
- "children": {
- "Staging": {
- "id": "Staging",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Staging",
- "constructInfo": {
- "fqn": "aws-cdk-lib.AssetStaging",
- "version": "0.0.0"
- }
- },
- "Repository": {
- "id": "Repository",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Repository",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset",
- "version": "0.0.0"
- }
- },
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "ecr:BatchCheckLayerAvailability",
- "ecr:BatchGetImage",
- "ecr:GetDownloadUrlForLayer"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecr:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":repository/",
- {
- "Fn::Sub": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"
- }
- ]
- ]
- }
- },
- {
- "Action": "ecr:GetAuthorizationToken",
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "QueueProcessingServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupCC92448A",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "QueueProcessingServiceQueueProcessingTaskDefExecutionRoleDefaultPolicyA83D332D",
- "roles": [
- {
- "Ref": "QueueProcessingServiceQueueProcessingTaskDefExecutionRole37838985"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.FargateTaskDefinition",
- "version": "0.0.0"
- }
- },
- "QueueProcessingFargateService": {
- "id": "QueueProcessingFargateService",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50,
- "alarms": {
- "alarmNames": [],
- "enable": false,
- "rollback": false
- }
- },
- "enableEcsManagedTags": false,
- "launchType": "FARGATE",
- "networkConfiguration": {
- "awsvpcConfiguration": {
- "assignPublicIp": "DISABLED",
- "subnets": [
- {
- "Ref": "VPCPrivateSubnet1Subnet8BCA10E0"
- },
- {
- "Ref": "VPCPrivateSubnet2SubnetCFCDAA7A"
- }
- ],
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "QueueProcessingServiceQueueProcessingFargateServiceSecurityGroup8FDF413D",
- "GroupId"
- ]
- }
- ]
- }
- },
- "taskDefinition": {
- "Ref": "QueueProcessingServiceQueueProcessingTaskDef4982F68B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/SecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0"
- }
- },
- "ScalingRole": {
- "id": "ScalingRole",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/ScalingRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "TaskCount": {
- "id": "TaskCount",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount",
- "children": {
- "Target": {
- "id": "Target",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ApplicationAutoScaling::ScalableTarget",
- "aws:cdk:cloudformation:props": {
- "maxCapacity": 2,
- "minCapacity": 0,
- "resourceId": {
- "Fn::Join": [
- "",
- [
- "service/",
- {
- "Ref": "EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"
- },
- "/",
- {
- "Fn::GetAtt": [
- "QueueProcessingServiceQueueProcessingFargateService0340DB9F",
- "Name"
- ]
- }
- ]
- ]
- },
- "roleArn": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":iam::",
- {
- "Ref": "AWS::AccountId"
- },
- ":role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService"
- ]
- ]
- },
- "scalableDimension": "ecs:service:DesiredCount",
- "serviceNamespace": "ecs"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.CfnScalableTarget",
- "version": "0.0.0"
- }
- },
- "CpuScaling": {
- "id": "CpuScaling",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/CpuScaling",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/CpuScaling/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ApplicationAutoScaling::ScalingPolicy",
- "aws:cdk:cloudformation:props": {
- "policyName": "awsecspatternsqueunocooldownQueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetCpuScalingBF08454B",
- "policyType": "TargetTrackingScaling",
- "scalingTargetId": {
- "Ref": "QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetA9D54444"
- },
- "targetTrackingScalingPolicyConfiguration": {
- "predefinedMetricSpecification": {
- "predefinedMetricType": "ECSServiceAverageCPUUtilization"
- },
- "targetValue": 50
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.TargetTrackingScalingPolicy",
- "version": "0.0.0"
- }
- },
- "QueueMessagesVisibleScaling": {
- "id": "QueueMessagesVisibleScaling",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling",
- "children": {
- "LowerPolicy": {
- "id": "LowerPolicy",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ApplicationAutoScaling::ScalingPolicy",
- "aws:cdk:cloudformation:props": {
- "policyName": "awsecspatternsqueunocooldownQueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicyBA6302DE",
- "policyType": "StepScaling",
- "scalingTargetId": {
- "Ref": "QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetA9D54444"
- },
- "stepScalingPolicyConfiguration": {
- "adjustmentType": "ChangeInCapacity",
- "cooldown": 600,
- "metricAggregationType": "Maximum",
- "stepAdjustments": [
- {
- "metricIntervalUpperBound": 0,
- "scalingAdjustment": -1
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.StepScalingAction",
- "version": "0.0.0"
- }
- },
- "LowerAlarm": {
- "id": "LowerAlarm",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::CloudWatch::Alarm",
- "aws:cdk:cloudformation:props": {
- "alarmActions": [
- {
- "Ref": "QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy332E2644"
- }
- ],
- "alarmDescription": "Lower threshold scaling alarm",
- "comparisonOperator": "LessThanOrEqualToThreshold",
- "dimensions": [
- {
- "name": "QueueName",
- "value": {
- "Fn::GetAtt": [
- "QueueProcessingServiceEcsProcessingQueue552F0B37",
- "QueueName"
- ]
- }
- }
- ],
- "evaluationPeriods": 1,
- "metricName": "ApproximateNumberOfMessagesVisible",
- "namespace": "AWS/SQS",
- "period": 300,
- "statistic": "Maximum",
- "threshold": 0
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.CfnAlarm",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.Alarm",
- "version": "0.0.0"
- }
- },
- "UpperPolicy": {
- "id": "UpperPolicy",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ApplicationAutoScaling::ScalingPolicy",
- "aws:cdk:cloudformation:props": {
- "policyName": "awsecspatternsqueunocooldownQueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy33343B0D",
- "policyType": "StepScaling",
- "scalingTargetId": {
- "Ref": "QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetA9D54444"
- },
- "stepScalingPolicyConfiguration": {
- "adjustmentType": "ChangeInCapacity",
- "cooldown": 600,
- "metricAggregationType": "Maximum",
- "stepAdjustments": [
- {
- "metricIntervalLowerBound": 0,
- "metricIntervalUpperBound": 400,
- "scalingAdjustment": 1
- },
- {
- "metricIntervalLowerBound": 400,
- "scalingAdjustment": 5
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.StepScalingAction",
- "version": "0.0.0"
- }
- },
- "UpperAlarm": {
- "id": "UpperAlarm",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::CloudWatch::Alarm",
- "aws:cdk:cloudformation:props": {
- "alarmActions": [
- {
- "Ref": "QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy84DD739A"
- }
- ],
- "alarmDescription": "Upper threshold scaling alarm",
- "comparisonOperator": "GreaterThanOrEqualToThreshold",
- "dimensions": [
- {
- "name": "QueueName",
- "value": {
- "Fn::GetAtt": [
- "QueueProcessingServiceEcsProcessingQueue552F0B37",
- "QueueName"
- ]
- }
- }
- ],
- "evaluationPeriods": 1,
- "metricName": "ApproximateNumberOfMessagesVisible",
- "namespace": "AWS/SQS",
- "period": 300,
- "statistic": "Maximum",
- "threshold": 100
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.CfnAlarm",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_cloudwatch.Alarm",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.StepScalingPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_applicationautoscaling.ScalableTarget",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ScalableTaskCount",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.FargateService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs_patterns.QueueProcessingFargateService",
- "version": "0.0.0"
- }
- },
- "EcsDefaultClusterMnL3mNNYNVPC": {
- "id": "EcsDefaultClusterMnL3mNNYNVPC",
- "path": "aws-ecs-patterns-queu-no-cooldown/EcsDefaultClusterMnL3mNNYNVPC",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-patterns-queu-no-cooldown/EcsDefaultClusterMnL3mNNYNVPC/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-patterns-queu-no-cooldown/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-patterns-queu-no-cooldown/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "queueProcessingFargateServiceTest": {
- "id": "queueProcessingFargateServiceTest",
- "path": "queueProcessingFargateServiceTest",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "queueProcessingFargateServiceTest/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "queueProcessingFargateServiceTest/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.3.0"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "queueProcessingFargateServiceTest/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "queueProcessingFargateServiceTest/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "queueProcessingFargateServiceTest/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.3.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-patterns-queu-no-cooldown":{"id":"aws-ecs-patterns-queu-no-cooldown","path":"aws-ecs-patterns-queu-no-cooldown","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"VPC":{"id":"VPC","path":"aws-ecs-patterns-queu-no-cooldown/VPC","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"restrictDefaultSecurityGroup":false,"maxAzs":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/VPC"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/VPC/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/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-ecs-patterns-queu-no-cooldown/VPC"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-patterns-queu-no-cooldown/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"}}}}}},"QueueProcessingService":{"id":"QueueProcessingService","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.QueueProcessingFargateService","version":"0.0.0"},"children":{"EcsProcessingDeadLetterQueue":{"id":"EcsProcessingDeadLetterQueue","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/EcsProcessingDeadLetterQueue","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.Queue","version":"0.0.0","metadata":[{"retentionPeriod":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/EcsProcessingDeadLetterQueue/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueue","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::Queue","aws:cdk:cloudformation:props":{"messageRetentionPeriod":1209600}}}}},"EcsProcessingQueue":{"id":"EcsProcessingQueue","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/EcsProcessingQueue","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.Queue","version":"0.0.0","metadata":[{"visibilityTimeout":"*","deadLetterQueue":{"queue":"*","maxReceiveCount":"*"}}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/EcsProcessingQueue/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueue","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::Queue","aws:cdk:cloudformation:props":{"redrivePolicy":{"deadLetterTargetArn":{"Fn::GetAtt":["QueueProcessingServiceEcsProcessingDeadLetterQueueD47A7C6B","Arn"]},"maxReceiveCount":3}}}}}},"SQSDeadLetterQueue":{"id":"SQSDeadLetterQueue","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/SQSDeadLetterQueue","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSDeadLetterQueueArn":{"id":"SQSDeadLetterQueueArn","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/SQSDeadLetterQueueArn","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSQueue":{"id":"SQSQueue","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/SQSQueue","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSQueueArn":{"id":"SQSQueueArn","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/SQSQueueArn","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"QueueProcessingTaskDef":{"id":"QueueProcessingTaskDef","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateTaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/TaskRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/TaskRole/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":["sqs:ChangeMessageVisibility","sqs:DeleteMessage","sqs:GetQueueAttributes","sqs:GetQueueUrl","sqs:ReceiveMessage"],"Effect":"Allow","Resource":{"Fn::GetAtt":["QueueProcessingServiceEcsProcessingQueue552F0B37","Arn"]}}],"Version":"2012-10-17"},"policyName":"QueueProcessingServiceQueueProcessingTaskDefTaskRoleDefaultPolicyAE808B19","roles":[{"Ref":"QueueProcessingServiceQueueProcessingTaskDefTaskRole782B79A6"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/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":{"Fn::Sub":"${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03"},"name":"QueueProcessingContainer","logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"QueueProcessingServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupCC92448A"},"awslogs-stream-prefix":"QueueProcessingService","awslogs-region":{"Ref":"AWS::Region"}}},"environment":[{"name":"QUEUE_NAME","value":{"Fn::GetAtt":["QueueProcessingServiceEcsProcessingQueue552F0B37","QueueName"]}}]}],"cpu":"256","executionRoleArn":{"Fn::GetAtt":["QueueProcessingServiceQueueProcessingTaskDefExecutionRole37838985","Arn"]},"family":"awsecspatternsqueunocooldownQueueProcessingServiceQueueProcessingTaskDefA90052F1","memory":"512","networkMode":"awsvpc","requiresCompatibilities":["FARGATE"],"taskRoleArn":{"Fn::GetAtt":["QueueProcessingServiceQueueProcessingTaskDefTaskRole782B79A6","Arn"]}}}},"QueueProcessingContainer":{"id":"QueueProcessingContainer","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"AssetImage":{"id":"AssetImage","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr_assets.DockerImageAsset","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Repository":{"id":"Repository","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Repository","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr.RepositoryBase","version":"0.0.0","metadata":[]}}}},"LogGroup":{"id":"LogGroup","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/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-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingTaskDef/ExecutionRole/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":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Fn::Sub":"cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"}]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"},{"Action":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["QueueProcessingServiceQueueProcessingTaskDefQueueProcessingContainerLogGroupCC92448A","Arn"]}}],"Version":"2012-10-17"},"policyName":"QueueProcessingServiceQueueProcessingTaskDefExecutionRoleDefaultPolicyA83D332D","roles":[{"Ref":"QueueProcessingServiceQueueProcessingTaskDefExecutionRole37838985"}]}}}}}}}}},"QueueProcessingFargateService":{"id":"QueueProcessingFargateService","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateService","version":"0.0.0","metadata":["*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/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":"EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50,"alarms":{"alarmNames":[],"enable":false,"rollback":false}},"enableEcsManagedTags":false,"launchType":"FARGATE","networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"DISABLED","subnets":[{"Ref":"VPCPrivateSubnet1Subnet8BCA10E0"},{"Ref":"VPCPrivateSubnet2SubnetCFCDAA7A"}],"securityGroups":[{"Fn::GetAtt":["QueueProcessingServiceQueueProcessingFargateServiceSecurityGroup8FDF413D","GroupId"]}]}},"taskDefinition":{"Ref":"QueueProcessingServiceQueueProcessingTaskDef4982F68B"}}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/SecurityGroup/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-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"ScalingRole":{"id":"ScalingRole","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/ScalingRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"TaskCount":{"id":"TaskCount","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ScalableTaskCount","version":"0.0.0"},"children":{"Target":{"id":"Target","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.ScalableTarget","version":"0.0.0","metadata":[{"serviceNamespace":"ecs","scalableDimension":"*","resourceId":"*","role":"*","minCapacity":"*","maxCapacity":"*"},{"scaleToTrackMetric":["*",{"predefinedMetric":"*","policyName":"*","disableScaleIn":"*","targetValue":"*","scaleInCooldown":"*"}]},{"scaleOnMetric":["*",{"metric":{"warnings":"*"},"scalingSteps":[{"upper":"*","change":"*"},{"lower":"*","change":"*"},{"lower":"*","change":"*"}],"cooldown":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalableTarget","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalableTarget","aws:cdk:cloudformation:props":{"maxCapacity":2,"minCapacity":0,"resourceId":{"Fn::Join":["",["service/",{"Ref":"EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3"},"/",{"Fn::GetAtt":["QueueProcessingServiceQueueProcessingFargateService0340DB9F","Name"]}]]},"roleArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::",{"Ref":"AWS::AccountId"},":role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService"]]},"scalableDimension":"ecs:service:DesiredCount","serviceNamespace":"ecs"}}},"CpuScaling":{"id":"CpuScaling","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/CpuScaling","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.TargetTrackingScalingPolicy","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/CpuScaling/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueunocooldownQueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetCpuScalingBF08454B","policyType":"TargetTrackingScaling","scalingTargetId":{"Ref":"QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetA9D54444"},"targetTrackingScalingPolicyConfiguration":{"predefinedMetricSpecification":{"predefinedMetricType":"ECSServiceAverageCPUUtilization"},"targetValue":50}}}}}},"QueueMessagesVisibleScaling":{"id":"QueueMessagesVisibleScaling","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingPolicy","version":"0.0.0"},"children":{"LowerPolicy":{"id":"LowerPolicy","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingAction","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueunocooldownQueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicyBA6302DE","policyType":"StepScaling","scalingTargetId":{"Ref":"QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetA9D54444"},"stepScalingPolicyConfiguration":{"adjustmentType":"ChangeInCapacity","cooldown":600,"metricAggregationType":"Maximum","stepAdjustments":[{"metricIntervalUpperBound":0,"scalingAdjustment":-1}]}}}}}},"LowerAlarm":{"id":"LowerAlarm","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.Alarm","version":"0.0.0","metadata":[{"metric":{"warnings":"*"},"alarmDescription":"*","comparisonOperator":"*","evaluationPeriods":"*","datapointsToAlarm":"*","threshold":"*"},{"addAlarmAction":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/LowerAlarm/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.CfnAlarm","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CloudWatch::Alarm","aws:cdk:cloudformation:props":{"alarmActions":[{"Ref":"QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingLowerPolicy332E2644"}],"alarmDescription":"Lower threshold scaling alarm","comparisonOperator":"LessThanOrEqualToThreshold","dimensions":[{"name":"QueueName","value":{"Fn::GetAtt":["QueueProcessingServiceEcsProcessingQueue552F0B37","QueueName"]}}],"evaluationPeriods":1,"metricName":"ApproximateNumberOfMessagesVisible","namespace":"AWS/SQS","period":300,"statistic":"Maximum","threshold":0}}}}},"UpperPolicy":{"id":"UpperPolicy","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.StepScalingAction","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueunocooldownQueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy33343B0D","policyType":"StepScaling","scalingTargetId":{"Ref":"QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetA9D54444"},"stepScalingPolicyConfiguration":{"adjustmentType":"ChangeInCapacity","cooldown":600,"metricAggregationType":"Maximum","stepAdjustments":[{"metricIntervalLowerBound":0,"metricIntervalUpperBound":400,"scalingAdjustment":1},{"metricIntervalLowerBound":400,"scalingAdjustment":5}]}}}}}},"UpperAlarm":{"id":"UpperAlarm","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.Alarm","version":"0.0.0","metadata":[{"metric":{"warnings":"*"},"alarmDescription":"*","comparisonOperator":"*","evaluationPeriods":"*","datapointsToAlarm":"*","threshold":"*"},{"addAlarmAction":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/QueueProcessingService/QueueProcessingFargateService/TaskCount/Target/QueueMessagesVisibleScaling/UpperAlarm/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.CfnAlarm","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CloudWatch::Alarm","aws:cdk:cloudformation:props":{"alarmActions":[{"Ref":"QueueProcessingServiceQueueProcessingFargateServiceTaskCountTargetQueueMessagesVisibleScalingUpperPolicy84DD739A"}],"alarmDescription":"Upper threshold scaling alarm","comparisonOperator":"GreaterThanOrEqualToThreshold","dimensions":[{"name":"QueueName","value":{"Fn::GetAtt":["QueueProcessingServiceEcsProcessingQueue552F0B37","QueueName"]}}],"evaluationPeriods":1,"metricName":"ApproximateNumberOfMessagesVisible","namespace":"AWS/SQS","period":300,"statistic":"Maximum","threshold":100}}}}}}}}}}}}}}},"EcsDefaultClusterMnL3mNNYNVPC":{"id":"EcsDefaultClusterMnL3mNNYNVPC","path":"aws-ecs-patterns-queu-no-cooldown/EcsDefaultClusterMnL3mNNYNVPC","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queu-no-cooldown/EcsDefaultClusterMnL3mNNYNVPC/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":{}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-patterns-queu-no-cooldown/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-patterns-queu-no-cooldown/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"queueProcessingFargateServiceTest":{"id":"queueProcessingFargateServiceTest","path":"queueProcessingFargateServiceTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"queueProcessingFargateServiceTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"queueProcessingFargateServiceTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"queueProcessingFargateServiceTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"queueProcessingFargateServiceTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"queueProcessingFargateServiceTest/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-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.assets.json
index 2af610f0d4a39..96033c34baf3e 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.assets.json
@@ -1,13 +1,14 @@
{
- "version": "36.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "IntegDefaultTestDeployAssert4E6713E1 Template",
"source": {
"path": "IntegDefaultTestDeployAssert4E6713E1.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/aws-ecs-runtime-integ.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/aws-ecs-runtime-integ.assets.json
index 17cbcde04d6fd..f4643b9d0335e 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/aws-ecs-runtime-integ.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/aws-ecs-runtime-integ.assets.json
@@ -1,13 +1,14 @@
{
- "version": "36.0.0",
+ "version": "45.0.0",
"files": {
"2fac8bc0968aa3b55cdca8838ec9cb8cf69ea4849507b817200c5f4f7f70bcd7": {
+ "displayName": "aws-ecs-runtime-integ Template",
"source": {
"path": "aws-ecs-runtime-integ.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-9072085b": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
"objectKey": "2fac8bc0968aa3b55cdca8838ec9cb8cf69ea4849507b817200c5f4f7f70bcd7.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
@@ -17,11 +18,12 @@
},
"dockerImages": {
"0a3355be12051c9984bf2b0b2bba4e6ea535968e5b6e7396449701732fe5ed14": {
+ "displayName": "ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/AssetImage",
"source": {
"directory": "asset.0a3355be12051c9984bf2b0b2bba4e6ea535968e5b6e7396449701732fe5ed14"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-94541639": {
"repositoryName": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}",
"imageTag": "0a3355be12051c9984bf2b0b2bba4e6ea535968e5b6e7396449701732fe5ed14",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-image-publishing-role-${AWS::AccountId}-${AWS::Region}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/cdk.out
index 1f0068d32659a..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"36.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/integ.json
index 879dc9aa8f5c2..1210831a4b0ec 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "36.0.0",
+ "version": "45.0.0",
"testCases": {
"Integ/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "Integ/DefaultTest/DeployAssert",
"assertionStackName": "IntegDefaultTestDeployAssert4E6713E1"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/manifest.json
index 996f4409b16c5..3a8c8a29e5007 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "36.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-runtime-integ.assets": {
"type": "cdk:asset-manifest",
@@ -34,12 +34,57 @@
"aws-ecs-runtime-integ.assets"
],
"metadata": {
+ "/aws-ecs-runtime-integ/Vpc": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "maxAzs": "*",
+ "restrictDefaultSecurityGroup": false
+ }
+ }
+ ],
"/aws-ecs-runtime-integ/Vpc/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "Vpc8378EB38"
}
],
+ "/aws-ecs-runtime-integ/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": [
+ "*"
+ ]
+ }
+ }
+ ],
"/aws-ecs-runtime-integ/Vpc/PublicSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -76,6 +121,34 @@
"data": "VpcPublicSubnet1NATGateway4D7517AA"
}
],
+ "/aws-ecs-runtime-integ/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": {}
+ }
+ ],
"/aws-ecs-runtime-integ/Vpc/PrivateSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -112,18 +185,91 @@
"data": "VpcVPCGWBF912B6E"
}
],
+ "/aws-ecs-runtime-integ/FargateCluster": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ }
+ ],
"/aws-ecs-runtime-integ/FargateCluster/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "FargateCluster7CCD5F93"
}
],
+ "/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledEventRule": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "schedule": "*",
+ "ruleName": "*",
+ "enabled": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addEventPattern": [
+ "*"
+ ]
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addTarget": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledEventRule/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTaskScheduledEventRule2B79E34F"
}
],
+ "/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ }
+ ],
+ "/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "assumedBy": {
+ "principalAccount": "*",
+ "assumeRoleAction": "*"
+ }
+ }
+ }
+ ],
+ "/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole/ImportTaskRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -136,36 +282,276 @@
"data": "ScheduledFargateTaskScheduledTaskDef521FA675"
}
],
+ "/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/LogGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "retention": "*"
+ }
+ }
+ ],
"/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/LogGroup/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTaskScheduledTaskDefScheduledContainerLogGroup4134B16C"
}
],
+ "/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "assumedBy": {
+ "principalAccount": "*",
+ "assumeRoleAction": "*"
+ },
+ "roleName": "*"
+ }
+ },
+ {
+ "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": [
+ {}
+ ]
+ }
+ }
+ ],
+ "/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/ImportExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTaskScheduledTaskDefExecutionRoleD37356D5"
}
],
+ "/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/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": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/DefaultPolicy/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTaskScheduledTaskDefExecutionRoleDefaultPolicy3E3AEE49"
}
],
+ "/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole": [
+ {
+ "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": [
+ {}
+ ]
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addToPrincipalPolicy": [
+ {}
+ ]
+ }
+ }
+ ],
+ "/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/ImportEventsRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTaskScheduledTaskDefEventsRole6CE19522"
}
],
+ "/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/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": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/DefaultPolicy/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTaskScheduledTaskDefEventsRoleDefaultPolicy4903ED72"
}
],
+ "/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ }
+ ],
"/aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -240,6 +626,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/tree.json
index d352868668bd2..b5d7b55cc1efb 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.runtime-platform-application-load-balanced-fargate-service.js.snapshot/tree.json
@@ -1,1024 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-runtime-integ": {
- "id": "aws-ecs-runtime-integ",
- "path": "aws-ecs-runtime-integ",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-runtime-integ/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-runtime-integ/Vpc/Resource",
- "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-ecs-runtime-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-runtime-integ/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-runtime-integ/Vpc/PublicSubnet1/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 0,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.0.0/17",
- "mapPublicIpOnLaunch": true,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "Public"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Public"
- },
- {
- "key": "Name",
- "value": "aws-ecs-runtime-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-runtime-integ/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-runtime-integ/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-runtime-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-runtime-integ/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-runtime-integ/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-runtime-integ/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-runtime-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-runtime-integ/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-runtime-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
- "version": "0.0.0"
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-runtime-integ/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-runtime-integ/Vpc/PrivateSubnet1/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 0,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.128.0/17",
- "mapPublicIpOnLaunch": false,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "Private"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Private"
- },
- {
- "key": "Name",
- "value": "aws-ecs-runtime-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-runtime-integ/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-runtime-integ/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-runtime-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-runtime-integ/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-runtime-integ/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
- "version": "0.0.0"
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-runtime-integ/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-runtime-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-runtime-integ/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0"
- }
- },
- "FargateCluster": {
- "id": "FargateCluster",
- "path": "aws-ecs-runtime-integ/FargateCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-runtime-integ/FargateCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0"
- }
- },
- "ScheduledFargateTask": {
- "id": "ScheduledFargateTask",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask",
- "children": {
- "ScheduledEventRule": {
- "id": "ScheduledEventRule",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledEventRule",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledEventRule/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Events::Rule",
- "aws:cdk:cloudformation:props": {
- "scheduleExpression": "rate(2 minutes)",
- "state": "ENABLED",
- "targets": [
- {
- "id": "Target0",
- "arn": {
- "Fn::GetAtt": [
- "FargateCluster7CCD5F93",
- "Arn"
- ]
- },
- "roleArn": {
- "Fn::GetAtt": [
- "ScheduledFargateTaskScheduledTaskDefEventsRole6CE19522",
- "Arn"
- ]
- },
- "ecsParameters": {
- "taskCount": 2,
- "taskDefinitionArn": {
- "Ref": "ScheduledFargateTaskScheduledTaskDef521FA675"
- },
- "launchType": "FARGATE",
- "networkConfiguration": {
- "awsVpcConfiguration": {
- "subnets": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- ],
- "assignPublicIp": "DISABLED",
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "ScheduledFargateTaskScheduledTaskDefSecurityGroupE075BC19",
- "GroupId"
- ]
- }
- ]
- }
- }
- },
- "input": "{}"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_events.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_events.Rule",
- "version": "0.0.0"
- }
- },
- "ScheduledTaskDef": {
- "id": "ScheduledTaskDef",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": {
- "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:0a3355be12051c9984bf2b0b2bba4e6ea535968e5b6e7396449701732fe5ed14"
- },
- "name": "ScheduledContainer",
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": {
- "Ref": "ScheduledFargateTaskScheduledTaskDefScheduledContainerLogGroup4134B16C"
- },
- "awslogs-stream-prefix": "ScheduledFargateTask",
- "awslogs-region": {
- "Ref": "AWS::Region"
- }
- }
- },
- "environment": [
- {
- "name": "TRIGGER",
- "value": "CloudWatch Events"
- }
- ]
- }
- ],
- "cpu": "256",
- "executionRoleArn": {
- "Fn::GetAtt": [
- "ScheduledFargateTaskScheduledTaskDefExecutionRoleD37356D5",
- "Arn"
- ]
- },
- "family": "awsecsruntimeintegScheduledFargateTaskScheduledTaskDef2C9C1AED",
- "memory": "512",
- "networkMode": "awsvpc",
- "requiresCompatibilities": [
- "FARGATE"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "ScheduledFargateTaskScheduledTaskDefTaskRoleD0FF16AD",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "ScheduledContainer": {
- "id": "ScheduledContainer",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer",
- "children": {
- "AssetImage": {
- "id": "AssetImage",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/AssetImage",
- "children": {
- "Staging": {
- "id": "Staging",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/AssetImage/Staging",
- "constructInfo": {
- "fqn": "aws-cdk-lib.AssetStaging",
- "version": "0.0.0"
- }
- },
- "Repository": {
- "id": "Repository",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/AssetImage/Repository",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset",
- "version": "0.0.0"
- }
- },
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "ecr:BatchCheckLayerAvailability",
- "ecr:BatchGetImage",
- "ecr:GetDownloadUrlForLayer"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecr:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":repository/",
- {
- "Fn::Sub": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"
- }
- ]
- ]
- }
- },
- {
- "Action": "ecr:GetAuthorizationToken",
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "ScheduledFargateTaskScheduledTaskDefScheduledContainerLogGroup4134B16C",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ScheduledFargateTaskScheduledTaskDefExecutionRoleDefaultPolicy3E3AEE49",
- "roles": [
- {
- "Ref": "ScheduledFargateTaskScheduledTaskDefExecutionRoleD37356D5"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- },
- "EventsRole": {
- "id": "EventsRole",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole",
- "children": {
- "ImportEventsRole": {
- "id": "ImportEventsRole",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/ImportEventsRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Role",
- "aws:cdk:cloudformation:props": {
- "assumeRolePolicyDocument": {
- "Statement": [
- {
- "Action": "sts:AssumeRole",
- "Effect": "Allow",
- "Principal": {
- "Service": "events.amazonaws.com"
- }
- }
- ],
- "Version": "2012-10-17"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "ecs:RunTask",
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "FargateCluster7CCD5F93",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": {
- "Ref": "ScheduledFargateTaskScheduledTaskDef521FA675"
- }
- },
- {
- "Action": "ecs:TagResource",
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecs:",
- {
- "Ref": "AWS::Region"
- },
- ":*:task/",
- {
- "Ref": "FargateCluster7CCD5F93"
- },
- "/*"
- ]
- ]
- }
- },
- {
- "Action": "iam:PassRole",
- "Effect": "Allow",
- "Resource": [
- {
- "Fn::GetAtt": [
- "ScheduledFargateTaskScheduledTaskDefExecutionRoleD37356D5",
- "Arn"
- ]
- },
- {
- "Fn::GetAtt": [
- "ScheduledFargateTaskScheduledTaskDefTaskRoleD0FF16AD",
- "Arn"
- ]
- }
- ]
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ScheduledFargateTaskScheduledTaskDefEventsRoleDefaultPolicy4903ED72",
- "roles": [
- {
- "Ref": "ScheduledFargateTaskScheduledTaskDefEventsRole6CE19522"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.FargateTaskDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs_patterns.ScheduledFargateTask",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-runtime-integ/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-runtime-integ/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Integ": {
- "id": "Integ",
- "path": "Integ",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "Integ/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "Integ/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.3.0"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "Integ/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "Integ/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "Integ/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.3.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-runtime-integ":{"id":"aws-ecs-runtime-integ","path":"aws-ecs-runtime-integ","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-runtime-integ/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-runtime-integ/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-ecs-runtime-integ/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-runtime-integ/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-ecs-runtime-integ/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/17","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"aws-ecs-runtime-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-runtime-integ/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-runtime-integ/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-ecs-runtime-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-runtime-integ/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-runtime-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-runtime-integ/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-ecs-runtime-integ/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-runtime-integ/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-runtime-integ/Vpc/PublicSubnet1"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-runtime-integ/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-ecs-runtime-integ/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/17","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"aws-ecs-runtime-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-runtime-integ/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-runtime-integ/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-ecs-runtime-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-runtime-integ/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-runtime-integ/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-runtime-integ/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-ecs-runtime-integ/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-runtime-integ/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"FargateCluster":{"id":"FargateCluster","path":"aws-ecs-runtime-integ/FargateCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-runtime-integ/FargateCluster/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":{}}}}},"ScheduledFargateTask":{"id":"ScheduledFargateTask","path":"aws-ecs-runtime-integ/ScheduledFargateTask","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.ScheduledFargateTask","version":"0.0.0"},"children":{"ScheduledEventRule":{"id":"ScheduledEventRule","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledEventRule","constructInfo":{"fqn":"aws-cdk-lib.aws_events.Rule","version":"0.0.0","metadata":[{"schedule":"*","ruleName":"*","enabled":"*"},{"addEventPattern":["*"]},{"addTarget":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledEventRule/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_events.CfnRule","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Events::Rule","aws:cdk:cloudformation:props":{"scheduleExpression":"rate(2 minutes)","state":"ENABLED","targets":[{"id":"Target0","arn":{"Fn::GetAtt":["FargateCluster7CCD5F93","Arn"]},"roleArn":{"Fn::GetAtt":["ScheduledFargateTaskScheduledTaskDefEventsRole6CE19522","Arn"]},"ecsParameters":{"taskCount":2,"taskDefinitionArn":{"Ref":"ScheduledFargateTaskScheduledTaskDef521FA675"},"launchType":"FARGATE","networkConfiguration":{"awsVpcConfiguration":{"subnets":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"}],"assignPublicIp":"DISABLED","securityGroups":[{"Fn::GetAtt":["ScheduledFargateTaskScheduledTaskDefSecurityGroupE075BC19","GroupId"]}]}}},"input":"{}"}]}}}}},"ScheduledTaskDef":{"id":"ScheduledTaskDef","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateTaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/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-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/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":{"Fn::Sub":"${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:0a3355be12051c9984bf2b0b2bba4e6ea535968e5b6e7396449701732fe5ed14"},"name":"ScheduledContainer","logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"ScheduledFargateTaskScheduledTaskDefScheduledContainerLogGroup4134B16C"},"awslogs-stream-prefix":"ScheduledFargateTask","awslogs-region":{"Ref":"AWS::Region"}}},"environment":[{"name":"TRIGGER","value":"CloudWatch Events"}]}],"cpu":"256","executionRoleArn":{"Fn::GetAtt":["ScheduledFargateTaskScheduledTaskDefExecutionRoleD37356D5","Arn"]},"family":"awsecsruntimeintegScheduledFargateTaskScheduledTaskDef2C9C1AED","memory":"512","networkMode":"awsvpc","requiresCompatibilities":["FARGATE"],"taskRoleArn":{"Fn::GetAtt":["ScheduledFargateTaskScheduledTaskDefTaskRoleD0FF16AD","Arn"]}}}},"ScheduledContainer":{"id":"ScheduledContainer","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"AssetImage":{"id":"AssetImage","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/AssetImage","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr_assets.DockerImageAsset","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/AssetImage/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Repository":{"id":"Repository","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/AssetImage/Repository","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr.RepositoryBase","version":"0.0.0","metadata":[]}}}},"LogGroup":{"id":"LogGroup","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/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-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/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":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Fn::Sub":"cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"}]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"},{"Action":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ScheduledFargateTaskScheduledTaskDefScheduledContainerLogGroup4134B16C","Arn"]}}],"Version":"2012-10-17"},"policyName":"ScheduledFargateTaskScheduledTaskDefExecutionRoleDefaultPolicy3E3AEE49","roles":[{"Ref":"ScheduledFargateTaskScheduledTaskDefExecutionRoleD37356D5"}]}}}}}}},"EventsRole":{"id":"EventsRole","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportEventsRole":{"id":"ImportEventsRole","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/ImportEventsRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/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":"events.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/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:RunTask","Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["FargateCluster7CCD5F93","Arn"]}}},"Effect":"Allow","Resource":{"Ref":"ScheduledFargateTaskScheduledTaskDef521FA675"}},{"Action":"ecs:TagResource","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecs:",{"Ref":"AWS::Region"},":*:task/",{"Ref":"FargateCluster7CCD5F93"},"/*"]]}},{"Action":"iam:PassRole","Effect":"Allow","Resource":[{"Fn::GetAtt":["ScheduledFargateTaskScheduledTaskDefExecutionRoleD37356D5","Arn"]},{"Fn::GetAtt":["ScheduledFargateTaskScheduledTaskDefTaskRoleD0FF16AD","Arn"]}]}],"Version":"2012-10-17"},"policyName":"ScheduledFargateTaskScheduledTaskDefEventsRoleDefaultPolicy4903ED72","roles":[{"Ref":"ScheduledFargateTaskScheduledTaskDefEventsRole6CE19522"}]}}}}}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup/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-ecs-runtime-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-runtime-integ/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-runtime-integ/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"Integ":{"id":"Integ","path":"Integ","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"Integ/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"Integ/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"Integ/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"Integ/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"Integ/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-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/aws-fargate-integ.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/aws-fargate-integ.assets.json
index 50be59f580b7b..80a6b95546281 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/aws-fargate-integ.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/aws-fargate-integ.assets.json
@@ -1,13 +1,14 @@
{
- "version": "36.0.0",
+ "version": "45.0.0",
"files": {
"de04b9df3a372c29acbe87af39fce37afa9e36fe30c2dc3a3cf1c3e49ff319bb": {
+ "displayName": "aws-fargate-integ Template",
"source": {
"path": "aws-fargate-integ.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-41fb2666": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
"objectKey": "de04b9df3a372c29acbe87af39fce37afa9e36fe30c2dc3a3cf1c3e49ff319bb.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
@@ -17,11 +18,12 @@
},
"dockerImages": {
"0a3355be12051c9984bf2b0b2bba4e6ea535968e5b6e7396449701732fe5ed14": {
+ "displayName": "ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/AssetImage",
"source": {
"directory": "asset.0a3355be12051c9984bf2b0b2bba4e6ea535968e5b6e7396449701732fe5ed14"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-94541639": {
"repositoryName": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}",
"imageTag": "0a3355be12051c9984bf2b0b2bba4e6ea535968e5b6e7396449701732fe5ed14",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-image-publishing-role-${AWS::AccountId}-${AWS::Region}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/cdk.out
index 1f0068d32659a..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"36.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/integ.json
index 21eba72a44429..e4b29bc0becc3 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "36.0.0",
+ "version": "45.0.0",
"testCases": {
"publicQueueProcessingFargateServiceTest/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "publicQueueProcessingFargateServiceTest/DefaultTest/DeployAssert",
"assertionStackName": "publicQueueProcessingFargateServiceTestDefaultTestDeployAssertD65416D6"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/manifest.json
index 304fa12bc8762..3d9c23da9fb12 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "36.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-fargate-integ.assets": {
"type": "cdk:asset-manifest",
@@ -34,12 +34,57 @@
"aws-fargate-integ.assets"
],
"metadata": {
+ "/aws-fargate-integ/Vpc": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "maxAzs": "*",
+ "restrictDefaultSecurityGroup": false
+ }
+ }
+ ],
"/aws-fargate-integ/Vpc/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "Vpc8378EB38"
}
],
+ "/aws-fargate-integ/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": [
+ "*"
+ ]
+ }
+ }
+ ],
"/aws-fargate-integ/Vpc/PublicSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -76,6 +121,34 @@
"data": "VpcPublicSubnet1NATGateway4D7517AA"
}
],
+ "/aws-fargate-integ/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": {}
+ }
+ ],
"/aws-fargate-integ/Vpc/PrivateSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -112,18 +185,91 @@
"data": "VpcVPCGWBF912B6E"
}
],
+ "/aws-fargate-integ/FargateCluster": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ }
+ ],
"/aws-fargate-integ/FargateCluster/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "FargateCluster7CCD5F93"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask/ScheduledEventRule": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "schedule": "*",
+ "ruleName": "*",
+ "enabled": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addEventPattern": [
+ "*"
+ ]
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addTarget": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask/ScheduledEventRule/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTaskScheduledEventRule2B79E34F"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ }
+ ],
+ "/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "assumedBy": {
+ "principalAccount": "*",
+ "assumeRoleAction": "*"
+ }
+ }
+ }
+ ],
+ "/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole/ImportTaskRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -136,48 +282,353 @@
"data": "ScheduledFargateTaskScheduledTaskDef521FA675"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/LogGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "retention": "*"
+ }
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/LogGroup/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTaskScheduledTaskDefScheduledContainerLogGroup4134B16C"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "assumedBy": {
+ "principalAccount": "*",
+ "assumeRoleAction": "*"
+ },
+ "roleName": "*"
+ }
+ },
+ {
+ "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": [
+ {}
+ ]
+ }
+ }
+ ],
+ "/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/ImportExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTaskScheduledTaskDefExecutionRoleD37356D5"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/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": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/DefaultPolicy/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTaskScheduledTaskDefExecutionRoleDefaultPolicy3E3AEE49"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole": [
+ {
+ "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": [
+ {}
+ ]
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addToPrincipalPolicy": [
+ {}
+ ]
+ }
+ }
+ ],
+ "/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/ImportEventsRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTaskScheduledTaskDefEventsRole6CE19522"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/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": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/DefaultPolicy/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTaskScheduledTaskDefEventsRoleDefaultPolicy4903ED72"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTaskScheduledTaskDefSecurityGroupE075BC19"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask2/ScheduledEventRule": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "schedule": "*",
+ "ruleName": "*",
+ "enabled": "*"
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addEventPattern": [
+ "*"
+ ]
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addTarget": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask2/ScheduledEventRule/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTask2ScheduledEventRuleB28B6E89"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": "*"
+ }
+ ],
+ "/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/TaskRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "assumedBy": {
+ "principalAccount": "*",
+ "assumeRoleAction": "*"
+ }
+ }
+ }
+ ],
+ "/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/TaskRole/ImportTaskRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/TaskRole/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -190,36 +641,276 @@
"data": "ScheduledFargateTask2ScheduledTaskDef7C71FC91"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/differentName/LogGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "retention": "*"
+ }
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/differentName/LogGroup/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTask2ScheduledTaskDefdifferentNameLogGroup68793F8C"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/ExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "assumedBy": {
+ "principalAccount": "*",
+ "assumeRoleAction": "*"
+ },
+ "roleName": "*"
+ }
+ },
+ {
+ "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": [
+ {}
+ ]
+ }
+ }
+ ],
+ "/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/ExecutionRole/ImportExecutionRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/ExecutionRole/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTask2ScheduledTaskDefExecutionRole03B3A539"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/ExecutionRole/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": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/ExecutionRole/DefaultPolicy/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTask2ScheduledTaskDefExecutionRoleDefaultPolicyA3F7D935"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/EventsRole": [
+ {
+ "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": [
+ {}
+ ]
+ }
+ },
+ {
+ "type": "aws:cdk:analytics:method",
+ "data": {
+ "addToPrincipalPolicy": [
+ {}
+ ]
+ }
+ }
+ ],
+ "/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/EventsRole/ImportEventsRole": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": "*"
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/EventsRole/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTask2ScheduledTaskDefEventsRoleDCCAD052"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/EventsRole/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": [
+ {}
+ ]
+ }
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/EventsRole/DefaultPolicy/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "ScheduledFargateTask2ScheduledTaskDefEventsRoleDefaultPolicyC878DEC4"
}
],
+ "/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/SecurityGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ }
+ ],
"/aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/SecurityGroup/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -294,6 +985,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/publicQueueProcessingFargateServiceTestDefaultTestDeployAssertD65416D6.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/publicQueueProcessingFargateServiceTestDefaultTestDeployAssertD65416D6.assets.json
index af36df896e3c4..04bbc3007c732 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/publicQueueProcessingFargateServiceTestDefaultTestDeployAssertD65416D6.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/publicQueueProcessingFargateServiceTestDefaultTestDeployAssertD65416D6.assets.json
@@ -1,13 +1,14 @@
{
- "version": "36.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "publicQueueProcessingFargateServiceTestDefaultTestDeployAssertD65416D6 Template",
"source": {
"path": "publicQueueProcessingFargateServiceTestDefaultTestDeployAssertD65416D6.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/tree.json
index a12207d8b916c..3e632d0e6bbae 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.scheduled-fargate-task.js.snapshot/tree.json
@@ -1,1582 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-fargate-integ": {
- "id": "aws-fargate-integ",
- "path": "aws-fargate-integ",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-fargate-integ/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/Vpc/Resource",
- "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-fargate-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-fargate-integ/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-fargate-integ/Vpc/PublicSubnet1/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 0,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.0.0/17",
- "mapPublicIpOnLaunch": true,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "Public"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Public"
- },
- {
- "key": "Name",
- "value": "aws-fargate-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-fargate-integ/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-fargate-integ/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-fargate-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-fargate-integ/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-fargate-integ/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-fargate-integ/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-fargate-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-fargate-integ/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-fargate-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
- "version": "0.0.0"
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-fargate-integ/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-fargate-integ/Vpc/PrivateSubnet1/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 0,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.128.0/17",
- "mapPublicIpOnLaunch": false,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "Private"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Private"
- },
- {
- "key": "Name",
- "value": "aws-fargate-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-fargate-integ/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-fargate-integ/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-fargate-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-fargate-integ/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-fargate-integ/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
- "version": "0.0.0"
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-fargate-integ/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-fargate-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-fargate-integ/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0"
- }
- },
- "FargateCluster": {
- "id": "FargateCluster",
- "path": "aws-fargate-integ/FargateCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/FargateCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0"
- }
- },
- "ScheduledFargateTask": {
- "id": "ScheduledFargateTask",
- "path": "aws-fargate-integ/ScheduledFargateTask",
- "children": {
- "ScheduledEventRule": {
- "id": "ScheduledEventRule",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledEventRule",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledEventRule/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Events::Rule",
- "aws:cdk:cloudformation:props": {
- "scheduleExpression": "rate(2 minutes)",
- "state": "ENABLED",
- "targets": [
- {
- "id": "Target0",
- "arn": {
- "Fn::GetAtt": [
- "FargateCluster7CCD5F93",
- "Arn"
- ]
- },
- "roleArn": {
- "Fn::GetAtt": [
- "ScheduledFargateTaskScheduledTaskDefEventsRole6CE19522",
- "Arn"
- ]
- },
- "ecsParameters": {
- "taskCount": 2,
- "taskDefinitionArn": {
- "Ref": "ScheduledFargateTaskScheduledTaskDef521FA675"
- },
- "propagateTags": "TASK_DEFINITION",
- "tagList": [
- {
- "key": "my-tag",
- "value": "my-tag-value"
- }
- ],
- "launchType": "FARGATE",
- "networkConfiguration": {
- "awsVpcConfiguration": {
- "subnets": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- ],
- "assignPublicIp": "DISABLED",
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "ScheduledFargateTaskScheduledTaskDefSecurityGroupE075BC19",
- "GroupId"
- ]
- }
- ]
- }
- }
- },
- "input": "{}"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_events.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_events.Rule",
- "version": "0.0.0"
- }
- },
- "ScheduledTaskDef": {
- "id": "ScheduledTaskDef",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": {
- "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:0a3355be12051c9984bf2b0b2bba4e6ea535968e5b6e7396449701732fe5ed14"
- },
- "name": "ScheduledContainer",
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": {
- "Ref": "ScheduledFargateTaskScheduledTaskDefScheduledContainerLogGroup4134B16C"
- },
- "awslogs-stream-prefix": "ScheduledFargateTask",
- "awslogs-region": {
- "Ref": "AWS::Region"
- }
- }
- },
- "environment": [
- {
- "name": "TRIGGER",
- "value": "CloudWatch Events"
- }
- ]
- }
- ],
- "cpu": "256",
- "executionRoleArn": {
- "Fn::GetAtt": [
- "ScheduledFargateTaskScheduledTaskDefExecutionRoleD37356D5",
- "Arn"
- ]
- },
- "family": "awsfargateintegScheduledFargateTaskScheduledTaskDefB0AD4F70",
- "memory": "512",
- "networkMode": "awsvpc",
- "requiresCompatibilities": [
- "FARGATE"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "ScheduledFargateTaskScheduledTaskDefTaskRoleD0FF16AD",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "ScheduledContainer": {
- "id": "ScheduledContainer",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer",
- "children": {
- "AssetImage": {
- "id": "AssetImage",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/AssetImage",
- "children": {
- "Staging": {
- "id": "Staging",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/AssetImage/Staging",
- "constructInfo": {
- "fqn": "aws-cdk-lib.AssetStaging",
- "version": "0.0.0"
- }
- },
- "Repository": {
- "id": "Repository",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/AssetImage/Repository",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset",
- "version": "0.0.0"
- }
- },
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "ecr:BatchCheckLayerAvailability",
- "ecr:BatchGetImage",
- "ecr:GetDownloadUrlForLayer"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecr:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":repository/",
- {
- "Fn::Sub": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"
- }
- ]
- ]
- }
- },
- {
- "Action": "ecr:GetAuthorizationToken",
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "ScheduledFargateTaskScheduledTaskDefScheduledContainerLogGroup4134B16C",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ScheduledFargateTaskScheduledTaskDefExecutionRoleDefaultPolicy3E3AEE49",
- "roles": [
- {
- "Ref": "ScheduledFargateTaskScheduledTaskDefExecutionRoleD37356D5"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- },
- "EventsRole": {
- "id": "EventsRole",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole",
- "children": {
- "ImportEventsRole": {
- "id": "ImportEventsRole",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/ImportEventsRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Role",
- "aws:cdk:cloudformation:props": {
- "assumeRolePolicyDocument": {
- "Statement": [
- {
- "Action": "sts:AssumeRole",
- "Effect": "Allow",
- "Principal": {
- "Service": "events.amazonaws.com"
- }
- }
- ],
- "Version": "2012-10-17"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "ecs:RunTask",
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "FargateCluster7CCD5F93",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": {
- "Ref": "ScheduledFargateTaskScheduledTaskDef521FA675"
- }
- },
- {
- "Action": "ecs:TagResource",
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecs:",
- {
- "Ref": "AWS::Region"
- },
- ":*:task/",
- {
- "Ref": "FargateCluster7CCD5F93"
- },
- "/*"
- ]
- ]
- }
- },
- {
- "Action": "iam:PassRole",
- "Effect": "Allow",
- "Resource": [
- {
- "Fn::GetAtt": [
- "ScheduledFargateTaskScheduledTaskDefExecutionRoleD37356D5",
- "Arn"
- ]
- },
- {
- "Fn::GetAtt": [
- "ScheduledFargateTaskScheduledTaskDefTaskRoleD0FF16AD",
- "Arn"
- ]
- }
- ]
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ScheduledFargateTaskScheduledTaskDefEventsRoleDefaultPolicy4903ED72",
- "roles": [
- {
- "Ref": "ScheduledFargateTaskScheduledTaskDefEventsRole6CE19522"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.FargateTaskDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs_patterns.ScheduledFargateTask",
- "version": "0.0.0"
- }
- },
- "ScheduledFargateTask2": {
- "id": "ScheduledFargateTask2",
- "path": "aws-fargate-integ/ScheduledFargateTask2",
- "children": {
- "ScheduledEventRule": {
- "id": "ScheduledEventRule",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledEventRule",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledEventRule/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Events::Rule",
- "aws:cdk:cloudformation:props": {
- "scheduleExpression": "rate(2 minutes)",
- "state": "ENABLED",
- "targets": [
- {
- "id": "Target0",
- "arn": {
- "Fn::GetAtt": [
- "FargateCluster7CCD5F93",
- "Arn"
- ]
- },
- "roleArn": {
- "Fn::GetAtt": [
- "ScheduledFargateTask2ScheduledTaskDefEventsRoleDCCAD052",
- "Arn"
- ]
- },
- "ecsParameters": {
- "taskCount": 2,
- "taskDefinitionArn": {
- "Ref": "ScheduledFargateTask2ScheduledTaskDef7C71FC91"
- },
- "propagateTags": "TASK_DEFINITION",
- "tagList": [
- {
- "key": "my-tag",
- "value": "my-tag-value"
- }
- ],
- "launchType": "FARGATE",
- "networkConfiguration": {
- "awsVpcConfiguration": {
- "subnets": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- ],
- "assignPublicIp": "DISABLED",
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "ScheduledFargateTask2ScheduledTaskDefSecurityGroup164B2B50",
- "GroupId"
- ]
- }
- ]
- }
- }
- },
- "input": "{}"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_events.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_events.Rule",
- "version": "0.0.0"
- }
- },
- "ScheduledTaskDef": {
- "id": "ScheduledTaskDef",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": {
- "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:0a3355be12051c9984bf2b0b2bba4e6ea535968e5b6e7396449701732fe5ed14"
- },
- "name": "differentName",
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": {
- "Ref": "ScheduledFargateTask2ScheduledTaskDefdifferentNameLogGroup68793F8C"
- },
- "awslogs-stream-prefix": "ScheduledFargateTask2",
- "awslogs-region": {
- "Ref": "AWS::Region"
- }
- }
- },
- "environment": [
- {
- "name": "TRIGGER",
- "value": "CloudWatch Events"
- }
- ]
- }
- ],
- "cpu": "256",
- "executionRoleArn": {
- "Fn::GetAtt": [
- "ScheduledFargateTask2ScheduledTaskDefExecutionRole03B3A539",
- "Arn"
- ]
- },
- "family": "awsfargateintegScheduledFargateTask2ScheduledTaskDef1F3A00F8",
- "memory": "512",
- "networkMode": "awsvpc",
- "requiresCompatibilities": [
- "FARGATE"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "ScheduledFargateTask2ScheduledTaskDefTaskRole98EC45BD",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "differentName": {
- "id": "differentName",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/differentName",
- "children": {
- "AssetImage": {
- "id": "AssetImage",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/differentName/AssetImage",
- "children": {
- "Staging": {
- "id": "Staging",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/differentName/AssetImage/Staging",
- "constructInfo": {
- "fqn": "aws-cdk-lib.AssetStaging",
- "version": "0.0.0"
- }
- },
- "Repository": {
- "id": "Repository",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/differentName/AssetImage/Repository",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset",
- "version": "0.0.0"
- }
- },
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/differentName/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/differentName/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "ecr:BatchCheckLayerAvailability",
- "ecr:BatchGetImage",
- "ecr:GetDownloadUrlForLayer"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecr:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":repository/",
- {
- "Fn::Sub": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"
- }
- ]
- ]
- }
- },
- {
- "Action": "ecr:GetAuthorizationToken",
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "ScheduledFargateTask2ScheduledTaskDefdifferentNameLogGroup68793F8C",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ScheduledFargateTask2ScheduledTaskDefExecutionRoleDefaultPolicyA3F7D935",
- "roles": [
- {
- "Ref": "ScheduledFargateTask2ScheduledTaskDefExecutionRole03B3A539"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- },
- "EventsRole": {
- "id": "EventsRole",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/EventsRole",
- "children": {
- "ImportEventsRole": {
- "id": "ImportEventsRole",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/EventsRole/ImportEventsRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/EventsRole/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Role",
- "aws:cdk:cloudformation:props": {
- "assumeRolePolicyDocument": {
- "Statement": [
- {
- "Action": "sts:AssumeRole",
- "Effect": "Allow",
- "Principal": {
- "Service": "events.amazonaws.com"
- }
- }
- ],
- "Version": "2012-10-17"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/EventsRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/EventsRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "ecs:RunTask",
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "FargateCluster7CCD5F93",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": {
- "Ref": "ScheduledFargateTask2ScheduledTaskDef7C71FC91"
- }
- },
- {
- "Action": "ecs:TagResource",
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecs:",
- {
- "Ref": "AWS::Region"
- },
- ":*:task/",
- {
- "Ref": "FargateCluster7CCD5F93"
- },
- "/*"
- ]
- ]
- }
- },
- {
- "Action": "iam:PassRole",
- "Effect": "Allow",
- "Resource": [
- {
- "Fn::GetAtt": [
- "ScheduledFargateTask2ScheduledTaskDefExecutionRole03B3A539",
- "Arn"
- ]
- },
- {
- "Fn::GetAtt": [
- "ScheduledFargateTask2ScheduledTaskDefTaskRole98EC45BD",
- "Arn"
- ]
- }
- ]
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ScheduledFargateTask2ScheduledTaskDefEventsRoleDefaultPolicyC878DEC4",
- "roles": [
- {
- "Ref": "ScheduledFargateTask2ScheduledTaskDefEventsRoleDCCAD052"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0"
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/SecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.FargateTaskDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs_patterns.ScheduledFargateTask",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-fargate-integ/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-fargate-integ/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "publicQueueProcessingFargateServiceTest": {
- "id": "publicQueueProcessingFargateServiceTest",
- "path": "publicQueueProcessingFargateServiceTest",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "publicQueueProcessingFargateServiceTest/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "publicQueueProcessingFargateServiceTest/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.3.0"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "publicQueueProcessingFargateServiceTest/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "publicQueueProcessingFargateServiceTest/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "publicQueueProcessingFargateServiceTest/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.3.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-fargate-integ":{"id":"aws-fargate-integ","path":"aws-fargate-integ","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-fargate-integ/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-fargate-integ/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-fargate-integ/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-fargate-integ/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-fargate-integ/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/17","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"aws-fargate-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-fargate-integ/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-fargate-integ/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-fargate-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-fargate-integ/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-fargate-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-fargate-integ/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-fargate-integ/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-fargate-integ/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-fargate-integ/Vpc/PublicSubnet1"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-fargate-integ/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-fargate-integ/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/17","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"aws-fargate-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-fargate-integ/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-fargate-integ/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-fargate-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-fargate-integ/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-fargate-integ/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"IGW":{"id":"IGW","path":"aws-fargate-integ/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-fargate-integ/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-fargate-integ/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"FargateCluster":{"id":"FargateCluster","path":"aws-fargate-integ/FargateCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-fargate-integ/FargateCluster/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":{}}}}},"ScheduledFargateTask":{"id":"ScheduledFargateTask","path":"aws-fargate-integ/ScheduledFargateTask","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.ScheduledFargateTask","version":"0.0.0"},"children":{"ScheduledEventRule":{"id":"ScheduledEventRule","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledEventRule","constructInfo":{"fqn":"aws-cdk-lib.aws_events.Rule","version":"0.0.0","metadata":[{"schedule":"*","ruleName":"*","enabled":"*"},{"addEventPattern":["*"]},{"addTarget":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledEventRule/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_events.CfnRule","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Events::Rule","aws:cdk:cloudformation:props":{"scheduleExpression":"rate(2 minutes)","state":"ENABLED","targets":[{"id":"Target0","arn":{"Fn::GetAtt":["FargateCluster7CCD5F93","Arn"]},"roleArn":{"Fn::GetAtt":["ScheduledFargateTaskScheduledTaskDefEventsRole6CE19522","Arn"]},"ecsParameters":{"taskCount":2,"taskDefinitionArn":{"Ref":"ScheduledFargateTaskScheduledTaskDef521FA675"},"propagateTags":"TASK_DEFINITION","tagList":[{"key":"my-tag","value":"my-tag-value"}],"launchType":"FARGATE","networkConfiguration":{"awsVpcConfiguration":{"subnets":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"}],"assignPublicIp":"DISABLED","securityGroups":[{"Fn::GetAtt":["ScheduledFargateTaskScheduledTaskDefSecurityGroupE075BC19","GroupId"]}]}}},"input":"{}"}]}}}}},"ScheduledTaskDef":{"id":"ScheduledTaskDef","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateTaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/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-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/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":{"Fn::Sub":"${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:0a3355be12051c9984bf2b0b2bba4e6ea535968e5b6e7396449701732fe5ed14"},"name":"ScheduledContainer","logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"ScheduledFargateTaskScheduledTaskDefScheduledContainerLogGroup4134B16C"},"awslogs-stream-prefix":"ScheduledFargateTask","awslogs-region":{"Ref":"AWS::Region"}}},"environment":[{"name":"TRIGGER","value":"CloudWatch Events"}]}],"cpu":"256","executionRoleArn":{"Fn::GetAtt":["ScheduledFargateTaskScheduledTaskDefExecutionRoleD37356D5","Arn"]},"family":"awsfargateintegScheduledFargateTaskScheduledTaskDefB0AD4F70","memory":"512","networkMode":"awsvpc","requiresCompatibilities":["FARGATE"],"taskRoleArn":{"Fn::GetAtt":["ScheduledFargateTaskScheduledTaskDefTaskRoleD0FF16AD","Arn"]}}}},"ScheduledContainer":{"id":"ScheduledContainer","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"AssetImage":{"id":"AssetImage","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/AssetImage","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr_assets.DockerImageAsset","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/AssetImage/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Repository":{"id":"Repository","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/AssetImage/Repository","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr.RepositoryBase","version":"0.0.0","metadata":[]}}}},"LogGroup":{"id":"LogGroup","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ScheduledContainer/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/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-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/ExecutionRole/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":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Fn::Sub":"cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"}]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"},{"Action":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ScheduledFargateTaskScheduledTaskDefScheduledContainerLogGroup4134B16C","Arn"]}}],"Version":"2012-10-17"},"policyName":"ScheduledFargateTaskScheduledTaskDefExecutionRoleDefaultPolicy3E3AEE49","roles":[{"Ref":"ScheduledFargateTaskScheduledTaskDefExecutionRoleD37356D5"}]}}}}}}},"EventsRole":{"id":"EventsRole","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportEventsRole":{"id":"ImportEventsRole","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/ImportEventsRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/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":"events.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/EventsRole/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:RunTask","Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["FargateCluster7CCD5F93","Arn"]}}},"Effect":"Allow","Resource":{"Ref":"ScheduledFargateTaskScheduledTaskDef521FA675"}},{"Action":"ecs:TagResource","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecs:",{"Ref":"AWS::Region"},":*:task/",{"Ref":"FargateCluster7CCD5F93"},"/*"]]}},{"Action":"iam:PassRole","Effect":"Allow","Resource":[{"Fn::GetAtt":["ScheduledFargateTaskScheduledTaskDefExecutionRoleD37356D5","Arn"]},{"Fn::GetAtt":["ScheduledFargateTaskScheduledTaskDefTaskRoleD0FF16AD","Arn"]}]}],"Version":"2012-10-17"},"policyName":"ScheduledFargateTaskScheduledTaskDefEventsRoleDefaultPolicy4903ED72","roles":[{"Ref":"ScheduledFargateTaskScheduledTaskDefEventsRole6CE19522"}]}}}}}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup/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-fargate-integ/ScheduledFargateTask/ScheduledTaskDef/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}}}}}},"ScheduledFargateTask2":{"id":"ScheduledFargateTask2","path":"aws-fargate-integ/ScheduledFargateTask2","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs_patterns.ScheduledFargateTask","version":"0.0.0"},"children":{"ScheduledEventRule":{"id":"ScheduledEventRule","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledEventRule","constructInfo":{"fqn":"aws-cdk-lib.aws_events.Rule","version":"0.0.0","metadata":[{"schedule":"*","ruleName":"*","enabled":"*"},{"addEventPattern":["*"]},{"addTarget":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledEventRule/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_events.CfnRule","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Events::Rule","aws:cdk:cloudformation:props":{"scheduleExpression":"rate(2 minutes)","state":"ENABLED","targets":[{"id":"Target0","arn":{"Fn::GetAtt":["FargateCluster7CCD5F93","Arn"]},"roleArn":{"Fn::GetAtt":["ScheduledFargateTask2ScheduledTaskDefEventsRoleDCCAD052","Arn"]},"ecsParameters":{"taskCount":2,"taskDefinitionArn":{"Ref":"ScheduledFargateTask2ScheduledTaskDef7C71FC91"},"propagateTags":"TASK_DEFINITION","tagList":[{"key":"my-tag","value":"my-tag-value"}],"launchType":"FARGATE","networkConfiguration":{"awsVpcConfiguration":{"subnets":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"}],"assignPublicIp":"DISABLED","securityGroups":[{"Fn::GetAtt":["ScheduledFargateTask2ScheduledTaskDefSecurityGroup164B2B50","GroupId"]}]}}},"input":"{}"}]}}}}},"ScheduledTaskDef":{"id":"ScheduledTaskDef","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FargateTaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/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-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/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":{"Fn::Sub":"${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:0a3355be12051c9984bf2b0b2bba4e6ea535968e5b6e7396449701732fe5ed14"},"name":"differentName","logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"ScheduledFargateTask2ScheduledTaskDefdifferentNameLogGroup68793F8C"},"awslogs-stream-prefix":"ScheduledFargateTask2","awslogs-region":{"Ref":"AWS::Region"}}},"environment":[{"name":"TRIGGER","value":"CloudWatch Events"}]}],"cpu":"256","executionRoleArn":{"Fn::GetAtt":["ScheduledFargateTask2ScheduledTaskDefExecutionRole03B3A539","Arn"]},"family":"awsfargateintegScheduledFargateTask2ScheduledTaskDef1F3A00F8","memory":"512","networkMode":"awsvpc","requiresCompatibilities":["FARGATE"],"taskRoleArn":{"Fn::GetAtt":["ScheduledFargateTask2ScheduledTaskDefTaskRole98EC45BD","Arn"]}}}},"differentName":{"id":"differentName","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/differentName","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"AssetImage":{"id":"AssetImage","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/differentName/AssetImage","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr_assets.DockerImageAsset","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/differentName/AssetImage/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Repository":{"id":"Repository","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/differentName/AssetImage/Repository","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr.RepositoryBase","version":"0.0.0","metadata":[]}}}},"LogGroup":{"id":"LogGroup","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/differentName/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/differentName/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/ExecutionRole/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-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/ExecutionRole/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":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Fn::Sub":"cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"}]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"},{"Action":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ScheduledFargateTask2ScheduledTaskDefdifferentNameLogGroup68793F8C","Arn"]}}],"Version":"2012-10-17"},"policyName":"ScheduledFargateTask2ScheduledTaskDefExecutionRoleDefaultPolicyA3F7D935","roles":[{"Ref":"ScheduledFargateTask2ScheduledTaskDefExecutionRole03B3A539"}]}}}}}}},"EventsRole":{"id":"EventsRole","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/EventsRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportEventsRole":{"id":"ImportEventsRole","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/EventsRole/ImportEventsRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/EventsRole/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":"events.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/EventsRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/EventsRole/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:RunTask","Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["FargateCluster7CCD5F93","Arn"]}}},"Effect":"Allow","Resource":{"Ref":"ScheduledFargateTask2ScheduledTaskDef7C71FC91"}},{"Action":"ecs:TagResource","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecs:",{"Ref":"AWS::Region"},":*:task/",{"Ref":"FargateCluster7CCD5F93"},"/*"]]}},{"Action":"iam:PassRole","Effect":"Allow","Resource":[{"Fn::GetAtt":["ScheduledFargateTask2ScheduledTaskDefExecutionRole03B3A539","Arn"]},{"Fn::GetAtt":["ScheduledFargateTask2ScheduledTaskDefTaskRole98EC45BD","Arn"]}]}],"Version":"2012-10-17"},"policyName":"ScheduledFargateTask2ScheduledTaskDefEventsRoleDefaultPolicyC878DEC4","roles":[{"Ref":"ScheduledFargateTask2ScheduledTaskDefEventsRoleDCCAD052"}]}}}}}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/SecurityGroup/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-fargate-integ/ScheduledFargateTask2/ScheduledTaskDef/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-fargate-integ/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-fargate-integ/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"publicQueueProcessingFargateServiceTest":{"id":"publicQueueProcessingFargateServiceTest","path":"publicQueueProcessingFargateServiceTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"publicQueueProcessingFargateServiceTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"publicQueueProcessingFargateServiceTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"publicQueueProcessingFargateServiceTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"publicQueueProcessingFargateServiceTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"publicQueueProcessingFargateServiceTest/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.app-mesh-proxy-config.js.snapshot/aws-ecs-integ-appmesh-proxy.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/aws-ecs-integ-appmesh-proxy.assets.json
index bb857db77f669..11e6b9ee69611 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/aws-ecs-integ-appmesh-proxy.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/aws-ecs-integ-appmesh-proxy.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "19fadc436528597502119694c37e43cec7832358cccd6839d6a39d2a9296bb21": {
+ "1ab373c2874d42d301426b93afa7ed8547622abc30557fa03f4c10982d4f8304": {
+ "displayName": "aws-ecs-integ-appmesh-proxy Template",
"source": {
"path": "aws-ecs-integ-appmesh-proxy.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-225fbed8": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "19fadc436528597502119694c37e43cec7832358cccd6839d6a39d2a9296bb21.json",
+ "objectKey": "1ab373c2874d42d301426b93afa7ed8547622abc30557fa03f4c10982d4f8304.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/aws-ecs-integ-appmesh-proxy.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/aws-ecs-integ-appmesh-proxy.template.json
index eb07fa70ab2fd..87b40c1404071 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/aws-ecs-integ-appmesh-proxy.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/aws-ecs-integ-appmesh-proxy.template.json
@@ -755,7 +755,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/integ.json
index 245702a5161b5..295681868d1ae 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"testCases": {
"integ.app-mesh-proxy-config": {
"stacks": [
@@ -10,5 +10,6 @@
}
},
"synthContext": {},
- "enableLookups": false
+ "enableLookups": false,
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/manifest.json
index 1b221177833b3..e6e94ca175820 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ-appmesh-proxy.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/19fadc436528597502119694c37e43cec7832358cccd6839d6a39d2a9296bb21.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/1ab373c2874d42d301426b93afa7ed8547622abc30557fa03f4c10982d4f8304.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1000,51 +1000,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ-appmesh-proxy"
@@ -1054,6 +1009,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/tree.json
index 8b8e5d09c26ba..f7baced63ebe2 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.app-mesh-proxy-config.js.snapshot/tree.json
@@ -1,2191 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ-appmesh-proxy": {
- "id": "aws-ecs-integ-appmesh-proxy",
- "path": "aws-ecs-integ-appmesh-proxy",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/Resource",
- "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-ecs-integ-appmesh-proxy/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-appmesh-proxy/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ-appmesh-proxy/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/ASG",
- "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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegappmeshproxyEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic6486DB9E": {
- "id": "AllowInvoke:awsecsintegappmeshproxyEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic6486DB9E",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegappmeshproxyEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic6486DB9E",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "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"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ-appmesh-proxy/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ-appmesh-proxy/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "memory": 256,
- "name": "web",
- "environment": [
- {
- "name": "AWS_REGION",
- "value": {
- "Ref": "AWS::Region"
- }
- }
- ]
- },
- {
- "essential": true,
- "image": "envoyproxy/envoy:v1.16.2",
- "memory": 256,
- "name": "envoy",
- "environment": [
- {
- "name": "AWS_REGION",
- "value": {
- "Ref": "AWS::Region"
- }
- }
- ]
- }
- ],
- "family": "awsecsintegappmeshproxyTaskDef1D8BFD08",
- "ipcMode": "host",
- "networkMode": "awsvpc",
- "pidMode": "task",
- "proxyConfiguration": {
- "containerName": "envoy",
- "proxyConfigurationProperties": [
- {
- "name": "IgnoredUID",
- "value": "1337"
- },
- {
- "name": "ProxyIngressPort",
- "value": "15000"
- },
- {
- "name": "ProxyEgressPort",
- "value": "15001"
- },
- {
- "name": "AppPorts",
- "value": "9080,9081"
- },
- {
- "name": "EgressIgnoredIPs",
- "value": "169.254.170.2,169.254.169.254"
- }
- ],
- "type": "APPMESH"
- },
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "web": {
- "id": "web",
- "path": "aws-ecs-integ-appmesh-proxy/TaskDef/web",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "envoy": {
- "id": "envoy",
- "path": "aws-ecs-integ-appmesh-proxy/TaskDef/envoy",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*"
- ]
- }
- },
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-appmesh-proxy/Service",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-appmesh-proxy/Service/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EcsCluster97242B84"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "launchType": "EC2",
- "networkConfiguration": {
- "awsvpcConfiguration": {
- "assignPublicIp": "DISABLED",
- "subnets": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ],
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "ServiceSecurityGroupC96ED6A7",
- "GroupId"
- ]
- }
- ]
- }
- },
- "schedulingStrategy": "REPLICA",
- "taskDefinition": {
- "Ref": "TaskDef54694570"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-integ-appmesh-proxy/Service/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-appmesh-proxy/Service/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-appmesh-proxy/Service/SecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-appmesh-proxy/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-appmesh-proxy/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ-appmesh-proxy":{"id":"aws-ecs-integ-appmesh-proxy","path":"aws-ecs-integ-appmesh-proxy","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-appmesh-proxy/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-appmesh-proxy/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-appmesh-proxy/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-appmesh-proxy/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-appmesh-proxy/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-appmesh-proxy/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-appmesh-proxy/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ-appmesh-proxy/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-appmesh-proxy/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-appmesh-proxy/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-appmesh-proxy/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-appmesh-proxy/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-appmesh-proxy/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegappmeshproxyEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic6486DB9E":{"id":"AllowInvoke:awsecsintegappmeshproxyEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic6486DB9E","path":"aws-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegappmeshproxyEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic6486DB9E","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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-appmesh-proxy/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-appmesh-proxy/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-appmesh-proxy/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-ecs-integ-appmesh-proxy/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","environment":[{"name":"AWS_REGION","value":{"Ref":"AWS::Region"}}]},{"essential":true,"image":"envoyproxy/envoy:v1.16.2","memory":256,"name":"envoy","environment":[{"name":"AWS_REGION","value":{"Ref":"AWS::Region"}}]}],"family":"awsecsintegappmeshproxyTaskDef1D8BFD08","ipcMode":"host","networkMode":"awsvpc","pidMode":"task","proxyConfiguration":{"containerName":"envoy","proxyConfigurationProperties":[{"name":"IgnoredUID","value":"1337"},{"name":"ProxyIngressPort","value":"15000"},{"name":"ProxyEgressPort","value":"15001"},{"name":"AppPorts","value":"9080,9081"},{"name":"EgressIgnoredIPs","value":"169.254.170.2,169.254.169.254"}],"type":"APPMESH"},"requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"aws-ecs-integ-appmesh-proxy/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}},"envoy":{"id":"envoy","path":"aws-ecs-integ-appmesh-proxy/TaskDef/envoy","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"Service":{"id":"Service","path":"aws-ecs-integ-appmesh-proxy/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ-appmesh-proxy/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","networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"DISABLED","subnets":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}],"securityGroups":[{"Fn::GetAtt":["ServiceSecurityGroupC96ED6A7","GroupId"]}]}},"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-integ-appmesh-proxy/Service/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-appmesh-proxy/Service/SecurityGroup/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-ecs-integ-appmesh-proxy/Service/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-appmesh-proxy/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-appmesh-proxy/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.availability-zone-rebalancing.js.snapshot/aws-ecs-integ-availability-zone-rebalancing.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/aws-ecs-integ-availability-zone-rebalancing.assets.json
index e105f752d9ead..627eab427cd8b 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/aws-ecs-integ-availability-zone-rebalancing.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/aws-ecs-integ-availability-zone-rebalancing.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "80389954ddc853fe88b467b9c719bf3ad69591e71d704a541535576f86e378c0": {
+ "24a432afa691ac4b65ed53102f08f8a7dd08e373614d078bbdf93f2d6ec00284": {
+ "displayName": "aws-ecs-integ-availability-zone-rebalancing Template",
"source": {
"path": "aws-ecs-integ-availability-zone-rebalancing.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-84d544a9": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "80389954ddc853fe88b467b9c719bf3ad69591e71d704a541535576f86e378c0.json",
+ "objectKey": "24a432afa691ac4b65ed53102f08f8a7dd08e373614d078bbdf93f2d6ec00284.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/aws-ecs-integ-availability-zone-rebalancing.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/aws-ecs-integ-availability-zone-rebalancing.template.json
index 181927a865117..e6da768d849f2 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/aws-ecs-integ-availability-zone-rebalancing.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/aws-ecs-integ-availability-zone-rebalancing.template.json
@@ -755,7 +755,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/awsecsintegavailabilityzonerebalancingAvailabilityZoneRebalancingDefaultTestDeployAssert8F80E41A.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/awsecsintegavailabilityzonerebalancingAvailabilityZoneRebalancingDefaultTestDeployAssert8F80E41A.assets.json
index 48bff55e61863..82e3b78966c09 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/awsecsintegavailabilityzonerebalancingAvailabilityZoneRebalancingDefaultTestDeployAssert8F80E41A.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/awsecsintegavailabilityzonerebalancingAvailabilityZoneRebalancingDefaultTestDeployAssert8F80E41A.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "awsecsintegavailabilityzonerebalancingAvailabilityZoneRebalancingDefaultTestDeployAssert8F80E41A Template",
"source": {
"path": "awsecsintegavailabilityzonerebalancingAvailabilityZoneRebalancingDefaultTestDeployAssert8F80E41A.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/integ.json
index 4b83f2c22db80..110174152c810 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"aws-ecs-integ-availability-zone-rebalancing/AvailabilityZoneRebalancing/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "aws-ecs-integ-availability-zone-rebalancing/AvailabilityZoneRebalancing/DefaultTest/DeployAssert",
"assertionStackName": "awsecsintegavailabilityzonerebalancingAvailabilityZoneRebalancingDefaultTestDeployAssert8F80E41A"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/manifest.json
index 341b779939ae0..158f7544a5a90 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"awsecsintegavailabilityzonerebalancingAvailabilityZoneRebalancingDefaultTestDeployAssert8F80E41A.assets": {
"type": "cdk:asset-manifest",
@@ -66,7 +66,7 @@
"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}/80389954ddc853fe88b467b9c719bf3ad69591e71d704a541535576f86e378c0.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/24a432afa691ac4b65ed53102f08f8a7dd08e373614d078bbdf93f2d6ec00284.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1002,51 +1002,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ-availability-zone-rebalancing"
@@ -1056,6 +1011,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/tree.json
index 2b8c086ff2347..ac3c0ed8dd8c0 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.availability-zone-rebalancing.js.snapshot/tree.json
@@ -1,2112 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ-availability-zone-rebalancing": {
- "id": "aws-ecs-integ-availability-zone-rebalancing",
- "path": "aws-ecs-integ-availability-zone-rebalancing",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/Resource",
- "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-ecs-integ-availability-zone-rebalancing/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-availability-zone-rebalancing/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ-availability-zone-rebalancing/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "#!/bin/bash\necho ECS_CLUSTER=",
- {
- "Ref": "EcsCluster97242B84"
- },
- " >> /etc/ecs/ecs.config"
- ]
- ]
- }
- }
- },
- "tagSpecifications": [
- {
- "resourceType": "launch-template",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/ASG",
- "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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegavailabilityzonerebalancingEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic34AF3231": {
- "id": "AllowInvoke:awsecsintegavailabilityzonerebalancingEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic34AF3231",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegavailabilityzonerebalancingEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic34AF3231",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "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"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "machineImage": "*",
- "updateType": "Replace",
- "instanceType": "*"
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ-availability-zone-rebalancing/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ-availability-zone-rebalancing/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-availability-zone-rebalancing/TaskDef/Resource",
- "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": "awsecsintegavailabilityzonerebalancingTaskDef2CEC7E0F",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "web": {
- "id": "web",
- "path": "aws-ecs-integ-availability-zone-rebalancing/TaskDef/web",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*"
- ]
- }
- },
- "FrontendService": {
- "id": "FrontendService",
- "path": "aws-ecs-integ-availability-zone-rebalancing/FrontendService",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-availability-zone-rebalancing/FrontendService/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "availabilityZoneRebalancing": "ENABLED",
- "cluster": {
- "Ref": "EcsCluster97242B84"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "launchType": "EC2",
- "schedulingStrategy": "REPLICA",
- "taskDefinition": {
- "Ref": "TaskDef54694570"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "AvailabilityZoneRebalancing": {
- "id": "AvailabilityZoneRebalancing",
- "path": "aws-ecs-integ-availability-zone-rebalancing/AvailabilityZoneRebalancing",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "aws-ecs-integ-availability-zone-rebalancing/AvailabilityZoneRebalancing/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "aws-ecs-integ-availability-zone-rebalancing/AvailabilityZoneRebalancing/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "aws-ecs-integ-availability-zone-rebalancing/AvailabilityZoneRebalancing/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-availability-zone-rebalancing/AvailabilityZoneRebalancing/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-availability-zone-rebalancing/AvailabilityZoneRebalancing/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-availability-zone-rebalancing/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-availability-zone-rebalancing/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ-availability-zone-rebalancing":{"id":"aws-ecs-integ-availability-zone-rebalancing","path":"aws-ecs-integ-availability-zone-rebalancing","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-availability-zone-rebalancing/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-availability-zone-rebalancing/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-availability-zone-rebalancing/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-availability-zone-rebalancing/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-availability-zone-rebalancing/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-availability-zone-rebalancing/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-availability-zone-rebalancing/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ-availability-zone-rebalancing/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-availability-zone-rebalancing/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-availability-zone-rebalancing/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-availability-zone-rebalancing/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-availability-zone-rebalancing/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-availability-zone-rebalancing/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","instanceType":"*"},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"EcsCluster97242B84"}," >> /etc/ecs/ecs.config"]]}}},"tagSpecifications":[{"resourceType":"launch-template","tags":[{"key":"Name","value":"aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegavailabilityzonerebalancingEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic34AF3231":{"id":"AllowInvoke:awsecsintegavailabilityzonerebalancingEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic34AF3231","path":"aws-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegavailabilityzonerebalancingEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic34AF3231","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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-availability-zone-rebalancing/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-availability-zone-rebalancing/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-availability-zone-rebalancing/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-ecs-integ-availability-zone-rebalancing/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":"awsecsintegavailabilityzonerebalancingTaskDef2CEC7E0F","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"aws-ecs-integ-availability-zone-rebalancing/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"FrontendService":{"id":"FrontendService","path":"aws-ecs-integ-availability-zone-rebalancing/FrontendService","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ-availability-zone-rebalancing/FrontendService/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":{"availabilityZoneRebalancing":"ENABLED","cluster":{"Ref":"EcsCluster97242B84"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"launchType":"EC2","schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"AvailabilityZoneRebalancing":{"id":"AvailabilityZoneRebalancing","path":"aws-ecs-integ-availability-zone-rebalancing/AvailabilityZoneRebalancing","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"aws-ecs-integ-availability-zone-rebalancing/AvailabilityZoneRebalancing/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"aws-ecs-integ-availability-zone-rebalancing/AvailabilityZoneRebalancing/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"aws-ecs-integ-availability-zone-rebalancing/AvailabilityZoneRebalancing/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-availability-zone-rebalancing/AvailabilityZoneRebalancing/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-availability-zone-rebalancing/AvailabilityZoneRebalancing/DefaultTest/DeployAssert/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-availability-zone-rebalancing/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-availability-zone-rebalancing/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.bottlerocket.js.snapshot/aws-ecs-integ-bottlerocket.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/aws-ecs-integ-bottlerocket.assets.json
index 059b50706c67b..5d2e7fd450bfe 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/aws-ecs-integ-bottlerocket.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/aws-ecs-integ-bottlerocket.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "e58eb540038a04d21d7f0e5a3a4b6592fbed80f5ca8e383454788d7e08d28ec2": {
+ "b0696ce9f15d8588d303db79b1d5eb92863fdb09729de1b5c8b20fa0ddebb676": {
+ "displayName": "aws-ecs-integ-bottlerocket Template",
"source": {
"path": "aws-ecs-integ-bottlerocket.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-75a7f9a3": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "e58eb540038a04d21d7f0e5a3a4b6592fbed80f5ca8e383454788d7e08d28ec2.json",
+ "objectKey": "b0696ce9f15d8588d303db79b1d5eb92863fdb09729de1b5c8b20fa0ddebb676.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/aws-ecs-integ-bottlerocket.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/aws-ecs-integ-bottlerocket.template.json
index 259f2625494cd..1a416a7c69a21 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/aws-ecs-integ-bottlerocket.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/aws-ecs-integ-bottlerocket.template.json
@@ -745,7 +745,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -761,7 +761,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/integ.json
index 545cf90f0db8a..fcb61a3f1908c 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"testCases": {
"integ.bottlerocket": {
"stacks": [
@@ -10,5 +10,6 @@
}
},
"synthContext": {},
- "enableLookups": false
+ "enableLookups": false,
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/manifest.json
index 19cb0f1259452..847bbadd56af5 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ-bottlerocket.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/e58eb540038a04d21d7f0e5a3a4b6592fbed80f5ca8e383454788d7e08d28ec2.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/b0696ce9f15d8588d303db79b1d5eb92863fdb09729de1b5c8b20fa0ddebb676.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -896,51 +896,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole07C0DC0DA": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole07C0DC0DA",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole10E3DC628": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole10E3DC628",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole2C85CCD01": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole2C85CCD01",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole367C81881": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole367C81881",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole43085D216": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole43085D216",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ-bottlerocket"
@@ -950,6 +905,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/tree.json
index 49ef5bc8fa948..70b6fa837c3e7 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.bottlerocket.js.snapshot/tree.json
@@ -1,1900 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ-bottlerocket": {
- "id": "aws-ecs-integ-bottlerocket",
- "path": "aws-ecs-integ-bottlerocket",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ-bottlerocket/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket/Vpc/Resource",
- "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-ecs-integ-bottlerocket/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ-bottlerocket/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ-bottlerocket/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ-bottlerocket/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ-bottlerocket/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ-bottlerocket/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ-bottlerocket/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "natGateways": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "bottlerocket-asg": {
- "id": "bottlerocket-asg",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/InstanceRole/Resource",
- "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"
- },
- "managedPolicyArns": [
- {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":iam::aws:policy/AmazonSSMManagedInstanceCore"
- ]
- ]
- },
- {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role"
- ]
- ]
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/InstanceRole/DefaultPolicy/Resource",
- "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": "EcsClusterbottlerocketasgInstanceRoleDefaultPolicy8523C598",
- "roles": [
- {
- "Ref": "EcsClusterbottlerocketasgInstanceRole96AA2ACF"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addManagedPolicy": [
- {
- "managedPolicyArn": "*"
- }
- ]
- },
- {
- "addManagedPolicy": [
- {
- "managedPolicyArn": "*"
- }
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterbottlerocketasgInstanceRole96AA2ACF"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "EcsClusterbottlerocketasgInstanceProfile22A89B9D",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsservicebottlerocketawsecs1x8664latestimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "c5.large",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "EcsClusterbottlerocketasgInstanceSecurityGroupD754BC23",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LaunchTemplate"
- }
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "\n[settings.ecs]\ncluster = \"",
- {
- "Ref": "EcsCluster97242B84"
- },
- "\""
- ]
- ]
- }
- }
- },
- "tagSpecifications": [
- {
- "resourceType": "launch-template",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "EcsClusterbottlerocketasgLaunchTemplateE141ADC4"
- },
- "version": {
- "Fn::GetAtt": [
- "EcsClusterbottlerocketasgLaunchTemplateE141ADC4",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "2",
- "minSize": "2",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "EcsClusterbottlerocketasgASGCB222A6E"
- }
- ]
- ]
- }
- },
- {
- "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": "EcsClusterbottlerocketasgDrainECSHookFunctionServiceRoleDefaultPolicyD5FBB46E",
- "roles": [
- {
- "Ref": "EcsClusterbottlerocketasgDrainECSHookFunctionServiceRole2F16AFAB"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": [
- "EcsClusterbottlerocketasgDrainECSHookFunctionServiceRole2F16AFAB",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegbottlerocketEcsClusterbottlerocketasgLifecycleHookDrainHookTopicD05837A8": {
- "id": "AllowInvoke:awsecsintegbottlerocketEcsClusterbottlerocketasgLifecycleHookDrainHookTopicD05837A8",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/DrainECSHook/Function/AllowInvoke:awsecsintegbottlerocketEcsClusterbottlerocketasgLifecycleHookDrainHookTopicD05837A8",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "EcsClusterbottlerocketasgDrainECSHookFunction7A8CD0E4",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "EcsClusterbottlerocketasgLifecycleHookDrainHookTopic64509A74"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterbottlerocketasgDrainECSHookFunction7A8CD0E4",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterbottlerocketasgLifecycleHookDrainHookTopic64509A74"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "EcsClusterbottlerocketasgLifecycleHookDrainHookTopic64509A74"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "EcsClusterbottlerocketasgLifecycleHookDrainHookRoleDefaultPolicy95E06EDB",
- "roles": [
- {
- "Ref": "EcsClusterbottlerocketasgLifecycleHookDrainHookRoleDE4D94EB"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "EcsClusterbottlerocketasgASGCB222A6E"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "EcsClusterbottlerocketasgLifecycleHookDrainHookTopic64509A74"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "EcsClusterbottlerocketasgLifecycleHookDrainHookRoleDE4D94EB",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "machineImage": "*",
- "updateType": "Replace",
- "minCapacity": "*",
- "instanceType": "*"
- },
- {
- "addUserData": [
- "*",
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "minCapacity": "*",
- "instanceType": "*",
- "machineImageType": 1
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 1
- }
- ]
- }
- ]
- }
- },
- "SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": {
- "id": "SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter",
- "path": "aws-ecs-integ-bottlerocket/SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118": {
- "id": "SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
- "path": "aws-ecs-integ-bottlerocket/SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-bottlerocket/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-bottlerocket/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ-bottlerocket":{"id":"aws-ecs-integ-bottlerocket","path":"aws-ecs-integ-bottlerocket","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-bottlerocket/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","natGateways":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket/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-ecs-integ-bottlerocket/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-bottlerocket/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-ecs-integ-bottlerocket/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-ecs-integ-bottlerocket/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-bottlerocket/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-bottlerocket/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-ecs-integ-bottlerocket/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-bottlerocket/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-bottlerocket/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-bottlerocket/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-ecs-integ-bottlerocket/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-bottlerocket/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ-bottlerocket/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":"*"},{}]},"children":{"Subnet":{"id":"Subnet","path":"aws-ecs-integ-bottlerocket/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-ecs-integ-bottlerocket/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-bottlerocket/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-bottlerocket/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-ecs-integ-bottlerocket/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-bottlerocket/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-bottlerocket/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-bottlerocket/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-ecs-integ-bottlerocket/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-ecs-integ-bottlerocket/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-bottlerocket/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-ecs-integ-bottlerocket/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-bottlerocket/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-bottlerocket/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ-bottlerocket/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-ecs-integ-bottlerocket/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-ecs-integ-bottlerocket/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-bottlerocket/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-bottlerocket/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-ecs-integ-bottlerocket/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-bottlerocket/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-bottlerocket/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-bottlerocket/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-ecs-integ-bottlerocket/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-bottlerocket/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ-bottlerocket/EcsCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addCapacity":["*",{"minCapacity":"*","instanceType":"*","machineImageType":1}]},{"addAutoScalingGroup":["*",{"machineImageType":1}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket/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":{}}},"bottlerocket-asg":{"id":"bottlerocket-asg","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","minCapacity":"*","instanceType":"*"},{"addUserData":["*","*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/InstanceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addManagedPolicy":[{"managedPolicyArn":"*"}]},{"addManagedPolicy":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportInstanceRole":{"id":"ImportInstanceRole","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/AmazonSSMManagedInstanceCore"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role"]]}],"tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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":"EcsClusterbottlerocketasgInstanceRoleDefaultPolicy8523C598","roles":[{"Ref":"EcsClusterbottlerocketasgInstanceRole96AA2ACF"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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":"EcsClusterbottlerocketasgInstanceRole96AA2ACF"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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":["EcsClusterbottlerocketasgInstanceProfile22A89B9D","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsservicebottlerocketawsecs1x8664latestimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"c5.large","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["EcsClusterbottlerocketasgInstanceSecurityGroupD754BC23","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["\n[settings.ecs]\ncluster = \"",{"Ref":"EcsCluster97242B84"},"\""]]}}},"tagSpecifications":[{"resourceType":"launch-template","tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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":"EcsClusterbottlerocketasgLaunchTemplateE141ADC4"},"version":{"Fn::GetAtt":["EcsClusterbottlerocketasgLaunchTemplateE141ADC4","LatestVersionNumber"]}},"maxSize":"2","minSize":"2","tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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":"EcsClusterbottlerocketasgASGCB222A6E"}]]}},{"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":"EcsClusterbottlerocketasgDrainECSHookFunctionServiceRoleDefaultPolicyD5FBB46E","roles":[{"Ref":"EcsClusterbottlerocketasgDrainECSHookFunctionServiceRole2F16AFAB"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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":["EcsClusterbottlerocketasgDrainECSHookFunctionServiceRole2F16AFAB","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg"}],"timeout":310}}},"AllowInvoke:awsecsintegbottlerocketEcsClusterbottlerocketasgLifecycleHookDrainHookTopicD05837A8":{"id":"AllowInvoke:awsecsintegbottlerocketEcsClusterbottlerocketasgLifecycleHookDrainHookTopicD05837A8","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/DrainECSHook/Function/AllowInvoke:awsecsintegbottlerocketEcsClusterbottlerocketasgLifecycleHookDrainHookTopicD05837A8","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":["EcsClusterbottlerocketasgDrainECSHookFunction7A8CD0E4","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"EcsClusterbottlerocketasgLifecycleHookDrainHookTopic64509A74"}}}},"Topic":{"id":"Topic","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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":["EcsClusterbottlerocketasgDrainECSHookFunction7A8CD0E4","Arn"]},"protocol":"lambda","topicArn":{"Ref":"EcsClusterbottlerocketasgLifecycleHookDrainHookTopic64509A74"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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":"EcsClusterbottlerocketasgLifecycleHookDrainHookTopic64509A74"}}],"Version":"2012-10-17"},"policyName":"EcsClusterbottlerocketasgLifecycleHookDrainHookRoleDefaultPolicy95E06EDB","roles":[{"Ref":"EcsClusterbottlerocketasgLifecycleHookDrainHookRoleDE4D94EB"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket/EcsCluster/bottlerocket-asg/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":"EcsClusterbottlerocketasgASGCB222A6E"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"EcsClusterbottlerocketasgLifecycleHookDrainHookTopic64509A74"},"roleArn":{"Fn::GetAtt":["EcsClusterbottlerocketasgLifecycleHookDrainHookRoleDE4D94EB","Arn"]}}}}}}}}}},"SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","path":"aws-ecs-integ-bottlerocket/SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","path":"aws-ecs-integ-bottlerocket/SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-bottlerocket/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-bottlerocket/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.capacity-provider.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/integ-ec2-capacity-provider.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/integ-ec2-capacity-provider.assets.json
index c51c56e2708d2..871d557fd1f65 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/integ-ec2-capacity-provider.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/integ-ec2-capacity-provider.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "2ed9dff548ce8e8080a12fc15c933f25b7e4ac0eba3771b02e9f07fb943c7146": {
+ "b46740c9d830fb2311ccdbda8cd4ad01b746c203045f57891b78e6244b6c72ba": {
+ "displayName": "integ-ec2-capacity-provider Template",
"source": {
"path": "integ-ec2-capacity-provider.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-ccd3bba2": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "2ed9dff548ce8e8080a12fc15c933f25b7e4ac0eba3771b02e9f07fb943c7146.json",
+ "objectKey": "b46740c9d830fb2311ccdbda8cd4ad01b746c203045f57891b78e6244b6c72ba.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/integ-ec2-capacity-provider.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/integ-ec2-capacity-provider.template.json
index e4b275b7c227d..1bcee7d453712 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/integ-ec2-capacity-provider.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/integ-ec2-capacity-provider.template.json
@@ -809,7 +809,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -825,7 +825,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/integ.json
index f8e6df41afd4d..38ab227a92411 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"testCases": {
"integ.capacity-provider": {
"stacks": [
@@ -10,5 +10,6 @@
}
},
"synthContext": {},
- "enableLookups": false
+ "enableLookups": false,
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/manifest.json
index 1d62b67ea1b99..9b922433c204b 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"integ-ec2-capacity-provider.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/2ed9dff548ce8e8080a12fc15c933f25b7e4ac0eba3771b02e9f07fb943c7146.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/b46740c9d830fb2311ccdbda8cd4ad01b746c203045f57891b78e6244b6c72ba.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -986,51 +986,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole00371FEB3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole00371FEB3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole17E852E01": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole17E852E01",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole22C962AF2": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole22C962AF2",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole3E4846C2B": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole3E4846C2B",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole48434A97B": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole48434A97B",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "integ-ec2-capacity-provider"
@@ -1040,6 +995,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/tree.json
index 311b2d82604da..58331e67cc93a 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.capacity-provider.js.snapshot/tree.json
@@ -1,2128 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "integ-ec2-capacity-provider": {
- "id": "integ-ec2-capacity-provider",
- "path": "integ-ec2-capacity-provider",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "integ-ec2-capacity-provider/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/Vpc/Resource",
- "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": "integ-ec2-capacity-provider/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet1/Subnet",
- "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": "integ-ec2-capacity-provider/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ec2-capacity-provider/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ec2-capacity-provider/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "integ-ec2-capacity-provider/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet2/Subnet",
- "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": "integ-ec2-capacity-provider/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ec2-capacity-provider/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ec2-capacity-provider/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "integ-ec2-capacity-provider/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "integ-ec2-capacity-provider/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "integ-ec2-capacity-provider/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-ec2-capacity-provider/Vpc/PrivateSubnet1/Subnet",
- "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": "integ-ec2-capacity-provider/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-ec2-capacity-provider/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-ec2-capacity-provider/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ec2-capacity-provider/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-ec2-capacity-provider/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-ec2-capacity-provider/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "integ-ec2-capacity-provider/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-ec2-capacity-provider/Vpc/PrivateSubnet2/Subnet",
- "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": "integ-ec2-capacity-provider/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-ec2-capacity-provider/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-ec2-capacity-provider/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ec2-capacity-provider/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-ec2-capacity-provider/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-ec2-capacity-provider/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "integ-ec2-capacity-provider/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ec2-capacity-provider/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "integ-ec2-capacity-provider/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EC2CPCluster": {
- "id": "EC2CPCluster",
- "path": "integ-ec2-capacity-provider/EC2CPCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/EC2CPCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "EC2CPCluster": {
- "id": "EC2CPCluster",
- "path": "integ-ec2-capacity-provider/EC2CPCluster/EC2CPCluster",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::ClusterCapacityProviderAssociations",
- "aws:cdk:cloudformation:props": {
- "capacityProviders": [
- "FARGATE",
- "FARGATE_SPOT",
- {
- "Ref": "EC2CapacityProvider5A2E35CD"
- }
- ],
- "cluster": {
- "Ref": "EC2CPClusterD5F0FD32"
- },
- "defaultCapacityProviderStrategy": []
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "enableFargateCapacityProviders": true
- },
- {
- "enableFargateCapacityProviders": []
- },
- {
- "addAsgCapacityProvider": [
- "*"
- ]
- }
- ]
- }
- },
- "TaskDef": {
- "id": "TaskDef",
- "path": "integ-ec2-capacity-provider/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "integ-ec2-capacity-provider/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "integ-ec2-capacity-provider/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "memoryReservation": 256,
- "name": "web"
- }
- ],
- "family": "integec2capacityproviderTaskDefA6140A6B",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "web": {
- "id": "web",
- "path": "integ-ec2-capacity-provider/TaskDef/web",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*"
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "integ-ec2-capacity-provider/ASG",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "integ-ec2-capacity-provider/ASG/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/ASG/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "integ-ec2-capacity-provider/ASG/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "integ-ec2-capacity-provider/ASG"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "integ-ec2-capacity-provider/ASG/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "integ-ec2-capacity-provider/ASG/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/ASG/InstanceRole/Resource",
- "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": "integ-ec2-capacity-provider/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "integ-ec2-capacity-provider/ASG/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/ASG/InstanceRole/DefaultPolicy/Resource",
- "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": [
- "EC2CPClusterD5F0FD32",
- "Arn"
- ]
- }
- },
- {
- "Action": [
- "ecs:Poll",
- "ecs:StartTelemetrySession"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "EC2CPClusterD5F0FD32",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecr:GetAuthorizationToken",
- "ecs:DiscoverPollEndpoint",
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ASGInstanceRoleDefaultPolicy7636D8BF",
- "roles": [
- {
- "Ref": "ASGInstanceRoleE263A41B"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "integ-ec2-capacity-provider/ASG/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "ASGInstanceRoleE263A41B"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "integ-ec2-capacity-provider/ASG/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "integ-ec2-capacity-provider/ASG/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/ASG/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "ASGInstanceProfile0A2834D7",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "t2.micro",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "ASGInstanceSecurityGroup0525485D",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ec2-capacity-provider/ASG/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ec2-capacity-provider/ASG/LaunchTemplate"
- }
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "#!/bin/bash\necho ECS_CLUSTER=",
- {
- "Ref": "EC2CPClusterD5F0FD32"
- },
- " >> /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": "integ-ec2-capacity-provider/ASG/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "integ-ec2-capacity-provider/ASG/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "ASGLaunchTemplate0CA92847"
- },
- "version": {
- "Fn::GetAtt": [
- "ASGLaunchTemplate0CA92847",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "1",
- "minSize": "1",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ec2-capacity-provider/ASG",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "integ-ec2-capacity-provider/ASG/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "integ-ec2-capacity-provider/ASG/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "integ-ec2-capacity-provider/ASG/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "integ-ec2-capacity-provider/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/ASG/DrainECSHook/Function/ServiceRole/Resource",
- "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": "integ-ec2-capacity-provider/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "integ-ec2-capacity-provider/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "ASG46ED3070"
- }
- ]
- ]
- }
- },
- {
- "Action": [
- "ecs:DescribeContainerInstances",
- "ecs:DescribeTasks",
- "ecs:ListTasks",
- "ecs:UpdateContainerInstancesState"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "EC2CPClusterD5F0FD32",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecs:ListContainerInstances",
- "ecs:SubmitContainerStateChange",
- "ecs:SubmitTaskStateChange"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "EC2CPClusterD5F0FD32",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27",
- "roles": [
- {
- "Ref": "ASGDrainECSHookFunctionServiceRoleC12963BB"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/ASG/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": "EC2CPClusterD5F0FD32"
- }
- }
- },
- "handler": "index.lambda_handler",
- "role": {
- "Fn::GetAtt": [
- "ASGDrainECSHookFunctionServiceRoleC12963BB",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ec2-capacity-provider/ASG"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:integec2capacityproviderASGLifecycleHookDrainHookTopic4714B3C1": {
- "id": "AllowInvoke:integec2capacityproviderASGLifecycleHookDrainHookTopic4714B3C1",
- "path": "integ-ec2-capacity-provider/ASG/DrainECSHook/Function/AllowInvoke:integec2capacityproviderASGLifecycleHookDrainHookTopic4714B3C1",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "ASGDrainECSHookFunction5F24CF4D",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "integ-ec2-capacity-provider/ASG/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/ASG/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "ASGDrainECSHookFunction5F24CF4D",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "integ-ec2-capacity-provider/ASG/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "integ-ec2-capacity-provider/ASG/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/ASG/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ec2-capacity-provider/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "integ-ec2-capacity-provider/ASG/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "integ-ec2-capacity-provider/ASG/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/ASG/LifecycleHookDrainHook/Role/Resource",
- "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": "integ-ec2-capacity-provider/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "integ-ec2-capacity-provider/ASG/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/ASG/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57",
- "roles": [
- {
- "Ref": "ASGLifecycleHookDrainHookRoleD640316C"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ec2-capacity-provider/ASG/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "ASG46ED3070"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "ASGLifecycleHookDrainHookRoleD640316C",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "instanceType": "*",
- "machineImage": "*"
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- },
- "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": "integ-ec2-capacity-provider/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": "integ-ec2-capacity-provider/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": []
- }
- },
- "EC2CapacityProvider": {
- "id": "EC2CapacityProvider",
- "path": "integ-ec2-capacity-provider/EC2CapacityProvider",
- "children": {
- "EC2CapacityProvider": {
- "id": "EC2CapacityProvider",
- "path": "integ-ec2-capacity-provider/EC2CapacityProvider/EC2CapacityProvider",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::CapacityProvider",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupProvider": {
- "autoScalingGroupArn": {
- "Ref": "ASG46ED3070"
- },
- "managedScaling": {
- "status": "ENABLED",
- "targetCapacity": 100
- },
- "managedTerminationProtection": "DISABLED"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCapacityProvider",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.AsgCapacityProvider",
- "version": "0.0.0"
- }
- },
- "EC2Service": {
- "id": "EC2Service",
- "path": "integ-ec2-capacity-provider/EC2Service",
- "children": {
- "Service": {
- "id": "Service",
- "path": "integ-ec2-capacity-provider/EC2Service/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "capacityProviderStrategy": [
- {
- "capacityProvider": {
- "Ref": "EC2CapacityProvider5A2E35CD"
- },
- "weight": 1
- }
- ],
- "cluster": {
- "Ref": "EC2CPClusterD5F0FD32"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "schedulingStrategy": "REPLICA",
- "taskDefinition": {
- "Ref": "TaskDef54694570"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "integ-ec2-capacity-provider/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "integ-ec2-capacity-provider/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"integ-ec2-capacity-provider":{"id":"integ-ec2-capacity-provider","path":"integ-ec2-capacity-provider","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"integ-ec2-capacity-provider/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ec2-capacity-provider/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ec2-capacity-provider/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ec2-capacity-provider/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"integ-ec2-capacity-provider/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"integ-ec2-capacity-provider/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ec2-capacity-provider/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ec2-capacity-provider/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ec2-capacity-provider/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"integ-ec2-capacity-provider/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"integ-ec2-capacity-provider/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ec2-capacity-provider/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ec2-capacity-provider/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ec2-capacity-provider/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ec2-capacity-provider/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ec2-capacity-provider/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ec2-capacity-provider/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"integ-ec2-capacity-provider/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EC2CPCluster":{"id":"EC2CPCluster","path":"integ-ec2-capacity-provider/EC2CPCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*","enableFargateCapacityProviders":true},{"enableFargateCapacityProviders":[]},{"addAsgCapacityProvider":["*"]}]},"children":{"Resource":{"id":"Resource","path":"integ-ec2-capacity-provider/EC2CPCluster/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":{}}},"EC2CPCluster":{"id":"EC2CPCluster","path":"integ-ec2-capacity-provider/EC2CPCluster/EC2CPCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":["FARGATE","FARGATE_SPOT",{"Ref":"EC2CapacityProvider5A2E35CD"}],"cluster":{"Ref":"EC2CPClusterD5F0FD32"},"defaultCapacityProviderStrategy":[]}}}}},"TaskDef":{"id":"TaskDef","path":"integ-ec2-capacity-provider/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"integ-ec2-capacity-provider/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"integ-ec2-capacity-provider/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/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","memoryReservation":256,"name":"web"}],"family":"integec2capacityproviderTaskDefA6140A6B","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"integ-ec2-capacity-provider/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"ASG":{"id":"ASG","path":"integ-ec2-capacity-provider/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","instanceType":"*","machineImage":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"integ-ec2-capacity-provider/ASG/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"integ-ec2-capacity-provider/ASG/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":"integ-ec2-capacity-provider/ASG/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"integ-ec2-capacity-provider/ASG"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"integ-ec2-capacity-provider/ASG/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":"integ-ec2-capacity-provider/ASG/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ec2-capacity-provider/ASG/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":"integ-ec2-capacity-provider/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ec2-capacity-provider/ASG/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":"integ-ec2-capacity-provider/ASG/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":["EC2CPClusterD5F0FD32","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ASGInstanceRoleDefaultPolicy7636D8BF","roles":[{"Ref":"ASGInstanceRoleE263A41B"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"integ-ec2-capacity-provider/ASG/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":"ASGInstanceRoleE263A41B"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"integ-ec2-capacity-provider/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"integ-ec2-capacity-provider/ASG/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":"integ-ec2-capacity-provider/ASG/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":["ASGInstanceProfile0A2834D7","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ASGInstanceSecurityGroup0525485D","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"integ-ec2-capacity-provider/ASG/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"integ-ec2-capacity-provider/ASG/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"EC2CPClusterD5F0FD32"}," >> /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":"integ-ec2-capacity-provider/ASG/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"integ-ec2-capacity-provider/ASG/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":"ASGLaunchTemplate0CA92847"},"version":{"Fn::GetAtt":["ASGLaunchTemplate0CA92847","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"integ-ec2-capacity-provider/ASG","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"integ-ec2-capacity-provider/ASG/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"integ-ec2-capacity-provider/ASG/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":"integ-ec2-capacity-provider/ASG/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":"integ-ec2-capacity-provider/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ec2-capacity-provider/ASG/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":"integ-ec2-capacity-provider/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ec2-capacity-provider/ASG/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":"integ-ec2-capacity-provider/ASG/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":"ASG46ED3070"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}],"Version":"2012-10-17"},"policyName":"ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27","roles":[{"Ref":"ASGDrainECSHookFunctionServiceRoleC12963BB"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-ec2-capacity-provider/ASG/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":"EC2CPClusterD5F0FD32"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ASGDrainECSHookFunctionServiceRoleC12963BB","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"integ-ec2-capacity-provider/ASG"}],"timeout":310}}},"AllowInvoke:integec2capacityproviderASGLifecycleHookDrainHookTopic4714B3C1":{"id":"AllowInvoke:integec2capacityproviderASGLifecycleHookDrainHookTopic4714B3C1","path":"integ-ec2-capacity-provider/ASG/DrainECSHook/Function/AllowInvoke:integec2capacityproviderASGLifecycleHookDrainHookTopic4714B3C1","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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}},"Topic":{"id":"Topic","path":"integ-ec2-capacity-provider/ASG/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":"integ-ec2-capacity-provider/ASG/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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"integ-ec2-capacity-provider/ASG/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":"integ-ec2-capacity-provider/ASG/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"integ-ec2-capacity-provider/ASG/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":"integ-ec2-capacity-provider/ASG"}]}}}}},"Role":{"id":"Role","path":"integ-ec2-capacity-provider/ASG/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":"integ-ec2-capacity-provider/ASG/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ec2-capacity-provider/ASG/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":"integ-ec2-capacity-provider/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ec2-capacity-provider/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"integ-ec2-capacity-provider/ASG/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":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}],"Version":"2012-10-17"},"policyName":"ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57","roles":[{"Ref":"ASGLifecycleHookDrainHookRoleD640316C"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-ec2-capacity-provider/ASG/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":"ASG46ED3070"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"},"roleArn":{"Fn::GetAtt":["ASGLifecycleHookDrainHookRoleD640316C","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":"integ-ec2-capacity-provider/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":"integ-ec2-capacity-provider/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":[]}},"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-ec2-capacity-provider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.AsgCapacityProvider","version":"0.0.0"},"children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-ec2-capacity-provider/EC2CapacityProvider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCapacityProvider","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::CapacityProvider","aws:cdk:cloudformation:props":{"autoScalingGroupProvider":{"autoScalingGroupArn":{"Ref":"ASG46ED3070"},"managedScaling":{"status":"ENABLED","targetCapacity":100},"managedTerminationProtection":"DISABLED"}}}}}},"EC2Service":{"id":"EC2Service","path":"integ-ec2-capacity-provider/EC2Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"integ-ec2-capacity-provider/EC2Service/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":{"capacityProviderStrategy":[{"capacityProvider":{"Ref":"EC2CapacityProvider5A2E35CD"},"weight":1}],"cluster":{"Ref":"EC2CPClusterD5F0FD32"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"integ-ec2-capacity-provider/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"integ-ec2-capacity-provider/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.clb-host-nw.js.snapshot/aws-ecs-integ.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/aws-ecs-integ.assets.json
index f817d1d6796d1..026e3008668c3 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/aws-ecs-integ.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/aws-ecs-integ.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "0ee50cd8a32cb3f8ec177822ba936107df21a5e6e88e281e0d6020d8c18ade02": {
+ "222848244618887689696d076dd686ee9359fad26165b97791fbf8b8ecbade2e": {
+ "displayName": "aws-ecs-integ Template",
"source": {
"path": "aws-ecs-integ.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-74a744d1": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "0ee50cd8a32cb3f8ec177822ba936107df21a5e6e88e281e0d6020d8c18ade02.json",
+ "objectKey": "222848244618887689696d076dd686ee9359fad26165b97791fbf8b8ecbade2e.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/aws-ecs-integ.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/aws-ecs-integ.template.json
index 7f4936fb6c4f2..b76a1eceda5e8 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/aws-ecs-integ.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/aws-ecs-integ.template.json
@@ -776,7 +776,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -792,7 +792,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/integ.json
index d810dfab43cc0..8fd13756e9966 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"testCases": {
"integ.clb-host-nw": {
"stacks": [
@@ -10,5 +10,6 @@
}
},
"synthContext": {},
- "enableLookups": false
+ "enableLookups": false,
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/manifest.json
index 3b7ae0b9479ba..caa09f316244f 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/0ee50cd8a32cb3f8ec177822ba936107df21a5e6e88e281e0d6020d8c18ade02.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/222848244618887689696d076dd686ee9359fad26165b97791fbf8b8ecbade2e.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1092,51 +1092,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ"
@@ -1146,6 +1101,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/tree.json
index b60d761015920..852ff735f718c 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.clb-host-nw.js.snapshot/tree.json
@@ -1,2294 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ": {
- "id": "aws-ecs-integ",
- "path": "aws-ecs-integ",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/Vpc/Resource",
- "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-ecs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- },
- "from awsecsintegLBSecurityGroupC30F5EB4:80": {
- "id": "from awsecsintegLBSecurityGroupC30F5EB4:80",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/from awsecsintegLBSecurityGroupC30F5EB4:80",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupIngress",
- "aws:cdk:cloudformation:props": {
- "description": "Port 80 LB to fleet",
- "fromPort": 80,
- "groupId": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231",
- "GroupId"
- ]
- },
- "ipProtocol": "tcp",
- "sourceSecurityGroupId": {
- "Fn::GetAtt": [
- "LBSecurityGroup8A41EA2B",
- "GroupId"
- ]
- },
- "toPort": 80
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- },
- {
- "addIngressRule": [
- "*",
- {},
- "*",
- true
- ]
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/ASG",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A": {
- "id": "AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "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"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ/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-ecs-integ/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-ecs-integ/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "memory": 256,
- "name": "web",
- "portMappings": [
- {
- "containerPort": 80,
- "protocol": "tcp"
- }
- ]
- }
- ],
- "family": "awsecsintegTaskDef6FDFB69A",
- "ipcMode": "host",
- "networkMode": "host",
- "pidMode": "task",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "web": {
- "id": "web",
- "path": "aws-ecs-integ/TaskDef/web",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*"
- ]
- }
- },
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ/Service",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ/Service/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EcsCluster97242B84"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "healthCheckGracePeriodSeconds": 60,
- "launchType": "EC2",
- "loadBalancers": [
- {
- "loadBalancerName": {
- "Ref": "LB8A12904C"
- },
- "containerName": "web",
- "containerPort": 80
- }
- ],
- "schedulingStrategy": "REPLICA",
- "taskDefinition": {
- "Ref": "TaskDef54694570"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*"
- ]
- }
- },
- "LB": {
- "id": "LB",
- "path": "aws-ecs-integ/LB",
- "children": {
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-integ/LB/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/LB/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ/LB/SecurityGroup",
- "securityGroupIngress": [
- {
- "cidrIp": "0.0.0.0/0",
- "ipProtocol": "tcp",
- "fromPort": 80,
- "toPort": 80,
- "description": "Default rule allow on 80"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- },
- "to awsecsintegEcsClusterDefaultAutoScalingGroupInstanceSecurityGroupF03D2457:80": {
- "id": "to awsecsintegEcsClusterDefaultAutoScalingGroupInstanceSecurityGroupF03D2457:80",
- "path": "aws-ecs-integ/LB/SecurityGroup/to awsecsintegEcsClusterDefaultAutoScalingGroupInstanceSecurityGroupF03D2457:80",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupEgress",
- "aws:cdk:cloudformation:props": {
- "description": "Port 80 LB to fleet",
- "destinationSecurityGroupId": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231",
- "GroupId"
- ]
- },
- "fromPort": 80,
- "groupId": {
- "Fn::GetAtt": [
- "LBSecurityGroup8A41EA2B",
- "GroupId"
- ]
- },
- "ipProtocol": "tcp",
- "toPort": 80
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupEgress",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": false
- },
- {
- "addIngressRule": [
- {
- "canInlineRule": true,
- "connections": "*",
- "uniqueId": "*"
- },
- {},
- "*",
- false
- ]
- },
- {
- "addEgressRule": [
- "*",
- {},
- "*",
- false
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/LB/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancing::LoadBalancer",
- "aws:cdk:cloudformation:props": {
- "crossZone": true,
- "listeners": [
- {
- "loadBalancerPort": "80",
- "protocol": "http",
- "instancePort": "80",
- "instanceProtocol": "http"
- }
- ],
- "scheme": "internal",
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "LBSecurityGroup8A41EA2B",
- "GroupId"
- ]
- }
- ],
- "subnets": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancing.CfnLoadBalancer",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancing.LoadBalancer",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addListener": [
- {
- "externalPort": "*"
- }
- ]
- },
- {
- "addTarget": [
- "*"
- ]
- }
- ]
- }
- },
- "LoadBalancerDNS": {
- "id": "LoadBalancerDNS",
- "path": "aws-ecs-integ/LoadBalancerDNS",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ":{"id":"aws-ecs-integ","path":"aws-ecs-integ","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true},{"addIngressRule":["*",{},"*",true]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"from awsecsintegLBSecurityGroupC30F5EB4:80":{"id":"from awsecsintegLBSecurityGroupC30F5EB4:80","path":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/from awsecsintegLBSecurityGroupC30F5EB4:80","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroupIngress","aws:cdk:cloudformation:props":{"description":"Port 80 LB to fleet","fromPort":80,"groupId":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231","GroupId"]},"ipProtocol":"tcp","sourceSecurityGroupId":{"Fn::GetAtt":["LBSecurityGroup8A41EA2B","GroupId"]},"toPort":80}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A":{"id":"AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A","path":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A","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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/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","portMappings":[{"containerPort":80,"protocol":"tcp"}]}],"family":"awsecsintegTaskDef6FDFB69A","ipcMode":"host","networkMode":"host","pidMode":"task","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"aws-ecs-integ/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"Service":{"id":"Service","path":"aws-ecs-integ/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ/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,"healthCheckGracePeriodSeconds":60,"launchType":"EC2","loadBalancers":[{"loadBalancerName":{"Ref":"LB8A12904C"},"containerName":"web","containerPort":80}],"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"LB":{"id":"LB","path":"aws-ecs-integ/LB","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancing.LoadBalancer","version":"0.0.0","metadata":[{"vpc":"*"},{"addListener":[{"externalPort":"*"}]},{"addTarget":["*"]}]},"children":{"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-integ/LB/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":false},{"addIngressRule":[{"canInlineRule":true,"connections":"*","uniqueId":"*"},{},"*",false]},{"addEgressRule":["*",{},"*",false]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/LB/SecurityGroup/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-ecs-integ/LB/SecurityGroup","securityGroupIngress":[{"cidrIp":"0.0.0.0/0","ipProtocol":"tcp","fromPort":80,"toPort":80,"description":"Default rule allow on 80"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"to awsecsintegEcsClusterDefaultAutoScalingGroupInstanceSecurityGroupF03D2457:80":{"id":"to awsecsintegEcsClusterDefaultAutoScalingGroupInstanceSecurityGroupF03D2457:80","path":"aws-ecs-integ/LB/SecurityGroup/to awsecsintegEcsClusterDefaultAutoScalingGroupInstanceSecurityGroupF03D2457:80","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroupEgress","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroupEgress","aws:cdk:cloudformation:props":{"description":"Port 80 LB to fleet","destinationSecurityGroupId":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231","GroupId"]},"fromPort":80,"groupId":{"Fn::GetAtt":["LBSecurityGroup8A41EA2B","GroupId"]},"ipProtocol":"tcp","toPort":80}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ/LB/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancing.CfnLoadBalancer","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancing::LoadBalancer","aws:cdk:cloudformation:props":{"crossZone":true,"listeners":[{"loadBalancerPort":"80","protocol":"http","instancePort":"80","instanceProtocol":"http"}],"scheme":"internal","securityGroups":[{"Fn::GetAtt":["LBSecurityGroup8A41EA2B","GroupId"]}],"subnets":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}}}},"LoadBalancerDNS":{"id":"LoadBalancerDNS","path":"aws-ecs-integ/LoadBalancerDNS","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ/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.cloudmap-container-port.js.snapshot/aws-ecs-integ.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/aws-ecs-integ.assets.json
index 2315aec57977c..430d22bdf4899 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/aws-ecs-integ.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/aws-ecs-integ.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "a2e4257665d19056143c4db55344ad90c00f21a27d79890e20bf9e89bbdcb527": {
+ "57118eaf61a8d9a28bd0347416dfe6e42254f15f6a276eed3c0713d1731ff21d": {
+ "displayName": "aws-ecs-integ Template",
"source": {
"path": "aws-ecs-integ.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-335d2d6e": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "a2e4257665d19056143c4db55344ad90c00f21a27d79890e20bf9e89bbdcb527.json",
+ "objectKey": "57118eaf61a8d9a28bd0347416dfe6e42254f15f6a276eed3c0713d1731ff21d.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/aws-ecs-integ.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/aws-ecs-integ.template.json
index ab27de3317ecc..7373f5a5ce4f7 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/aws-ecs-integ.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/aws-ecs-integ.template.json
@@ -555,7 +555,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -571,7 +571,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/integ.json
index 89cad6a47a0c0..a1876c19da165 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"testCases": {
"integ.cloudmap-container-port": {
"stacks": [
@@ -10,5 +10,6 @@
}
},
"synthContext": {},
- "enableLookups": false
+ "enableLookups": false,
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/manifest.json
index 87d27c44aca11..c4cc06163b586 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/a2e4257665d19056143c4db55344ad90c00f21a27d79890e20bf9e89bbdcb527.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/57118eaf61a8d9a28bd0347416dfe6e42254f15f6a276eed3c0713d1731ff21d.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -919,51 +919,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "FargateClustercapacityDrainECSHookFunctioninlinePolicyAddedToExecutionRole0987FAD33": [
- {
- "type": "aws:cdk:logicalId",
- "data": "FargateClustercapacityDrainECSHookFunctioninlinePolicyAddedToExecutionRole0987FAD33",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "FargateClustercapacityDrainECSHookFunctioninlinePolicyAddedToExecutionRole14C257275": [
- {
- "type": "aws:cdk:logicalId",
- "data": "FargateClustercapacityDrainECSHookFunctioninlinePolicyAddedToExecutionRole14C257275",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "FargateClustercapacityDrainECSHookFunctioninlinePolicyAddedToExecutionRole2A1F0C369": [
- {
- "type": "aws:cdk:logicalId",
- "data": "FargateClustercapacityDrainECSHookFunctioninlinePolicyAddedToExecutionRole2A1F0C369",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "FargateClustercapacityDrainECSHookFunctioninlinePolicyAddedToExecutionRole3A85241C9": [
- {
- "type": "aws:cdk:logicalId",
- "data": "FargateClustercapacityDrainECSHookFunctioninlinePolicyAddedToExecutionRole3A85241C9",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "FargateClustercapacityDrainECSHookFunctioninlinePolicyAddedToExecutionRole4DA338734": [
- {
- "type": "aws:cdk:logicalId",
- "data": "FargateClustercapacityDrainECSHookFunctioninlinePolicyAddedToExecutionRole4DA338734",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ"
@@ -973,6 +928,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/tree.json
index d4c57e10e4f46..aa0f432659192 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.cloudmap-container-port.js.snapshot/tree.json
@@ -1,1871 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ": {
- "id": "aws-ecs-integ",
- "path": "aws-ecs-integ",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/Vpc/Resource",
- "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-ecs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "pubSubnet1": {
- "id": "pubSubnet1",
- "path": "aws-ecs-integ/Vpc/pubSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/pubSubnet1/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 0,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.0.0/24",
- "mapPublicIpOnLaunch": true,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "pub"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Public"
- },
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/pubSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/pubSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/pubSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/pubSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/pubSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcpubSubnet1RouteTableE0483FDA"
- },
- "subnetId": {
- "Ref": "VpcpubSubnet1Subnet410C08CF"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/pubSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcpubSubnet1RouteTableE0483FDA"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "pubSubnet2": {
- "id": "pubSubnet2",
- "path": "aws-ecs-integ/Vpc/pubSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/pubSubnet2/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 1,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.1.0/24",
- "mapPublicIpOnLaunch": true,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "pub"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Public"
- },
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/pubSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/pubSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/pubSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/pubSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/pubSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcpubSubnet2RouteTable5A29DF40"
- },
- "subnetId": {
- "Ref": "VpcpubSubnet2Subnet44A37A0D"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/pubSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcpubSubnet2RouteTable5A29DF40"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "restrictDefaultSecurityGroup": false,
- "maxAzs": "*",
- "subnetConfiguration": [
- {
- "name": "*",
- "cidrMask": "*",
- "subnetType": "Public"
- }
- ]
- }
- ]
- }
- },
- "FargateCluster": {
- "id": "FargateCluster",
- "path": "aws-ecs-integ/FargateCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/FargateCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "capacity": {
- "id": "capacity",
- "path": "aws-ecs-integ/FargateCluster/capacity",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ/FargateCluster/capacity/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/FargateCluster/capacity/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ/FargateCluster/capacity/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "securityGroupIngress": [
- {
- "cidrIp": "0.0.0.0/0",
- "ipProtocol": "tcp",
- "fromPort": 32768,
- "toPort": 61000,
- "description": "from 0.0.0.0/0:32768-61000"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/FargateCluster/capacity"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- },
- {
- "addIngressRule": [
- {
- "canInlineRule": true,
- "connections": "*",
- "uniqueId": "*"
- },
- {},
- "*",
- false
- ]
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ/FargateCluster/capacity/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ/FargateCluster/capacity/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/FargateCluster/capacity/InstanceRole/Resource",
- "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-ecs-integ/FargateCluster/capacity"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/FargateCluster/capacity/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/FargateCluster/capacity/InstanceRole/DefaultPolicy/Resource",
- "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": [
- "FargateCluster7CCD5F93",
- "Arn"
- ]
- }
- },
- {
- "Action": [
- "ecs:Poll",
- "ecs:StartTelemetrySession"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "FargateCluster7CCD5F93",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecr:GetAuthorizationToken",
- "ecs:DiscoverPollEndpoint",
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "FargateClustercapacityInstanceRoleDefaultPolicy90B38927",
- "roles": [
- {
- "Ref": "FargateClustercapacityInstanceRoleBE253D2D"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ/FargateCluster/capacity/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "FargateClustercapacityInstanceRoleBE253D2D"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ/FargateCluster/capacity/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ/FargateCluster/capacity/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/FargateCluster/capacity/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "FargateClustercapacityInstanceProfile8294296C",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "t3.micro",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "FargateClustercapacityInstanceSecurityGroupCB3AEDA1",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/FargateCluster/capacity/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/FargateCluster/capacity/LaunchTemplate"
- }
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "#!/bin/bash\necho ECS_CLUSTER=",
- {
- "Ref": "FargateCluster7CCD5F93"
- },
- " >> /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-ecs-integ/FargateCluster/capacity/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ/FargateCluster/capacity/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "desiredCapacity": "1",
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "FargateClustercapacityLaunchTemplateD01E44DB"
- },
- "version": {
- "Fn::GetAtt": [
- "FargateClustercapacityLaunchTemplateD01E44DB",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "1",
- "minSize": "1",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/FargateCluster/capacity",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcpubSubnet1Subnet410C08CF"
- },
- {
- "Ref": "VpcpubSubnet2Subnet44A37A0D"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ/FargateCluster/capacity/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ/FargateCluster/capacity/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ/FargateCluster/capacity/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ/FargateCluster/capacity/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/FargateCluster/capacity/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ/FargateCluster/capacity"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/FargateCluster/capacity/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/FargateCluster/capacity/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "FargateClustercapacityASGE4034F96"
- }
- ]
- ]
- }
- },
- {
- "Action": [
- "ecs:DescribeContainerInstances",
- "ecs:DescribeTasks",
- "ecs:ListTasks",
- "ecs:UpdateContainerInstancesState"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "FargateCluster7CCD5F93",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecs:ListContainerInstances",
- "ecs:SubmitContainerStateChange",
- "ecs:SubmitTaskStateChange"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "FargateCluster7CCD5F93",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "FargateClustercapacityDrainECSHookFunctionServiceRoleDefaultPolicy53CD1145",
- "roles": [
- {
- "Ref": "FargateClustercapacityDrainECSHookFunctionServiceRoleA28505D9"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/FargateCluster/capacity/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": "FargateCluster7CCD5F93"
- }
- }
- },
- "handler": "index.lambda_handler",
- "role": {
- "Fn::GetAtt": [
- "FargateClustercapacityDrainECSHookFunctionServiceRoleA28505D9",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/FargateCluster/capacity"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegFargateClustercapacityLifecycleHookDrainHookTopic07C1229F": {
- "id": "AllowInvoke:awsecsintegFargateClustercapacityLifecycleHookDrainHookTopic07C1229F",
- "path": "aws-ecs-integ/FargateCluster/capacity/DrainECSHook/Function/AllowInvoke:awsecsintegFargateClustercapacityLifecycleHookDrainHookTopic07C1229F",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "FargateClustercapacityDrainECSHookFunction3E60E6D0",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "FargateClustercapacityLifecycleHookDrainHookTopic390A0E34"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ/FargateCluster/capacity/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/FargateCluster/capacity/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "FargateClustercapacityDrainECSHookFunction3E60E6D0",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "FargateClustercapacityLifecycleHookDrainHookTopic390A0E34"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ/FargateCluster/capacity/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ/FargateCluster/capacity/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/FargateCluster/capacity/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/FargateCluster/capacity"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ/FargateCluster/capacity/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ/FargateCluster/capacity/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/FargateCluster/capacity/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ/FargateCluster/capacity"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/FargateCluster/capacity/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/FargateCluster/capacity/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "FargateClustercapacityLifecycleHookDrainHookTopic390A0E34"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "FargateClustercapacityLifecycleHookDrainHookRoleDefaultPolicyACCDDB70",
- "roles": [
- {
- "Ref": "FargateClustercapacityLifecycleHookDrainHookRoleDD26E39B"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/FargateCluster/capacity/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "FargateClustercapacityASGE4034F96"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "FargateClustercapacityLifecycleHookDrainHookTopic390A0E34"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "FargateClustercapacityLifecycleHookDrainHookRoleDD26E39B",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "machineImage": "*",
- "updateType": "Replace",
- "instanceType": "*",
- "desiredCapacity": "*",
- "minCapacity": "*",
- "maxCapacity": "*"
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- },
- "DefaultServiceDiscoveryNamespace": {
- "id": "DefaultServiceDiscoveryNamespace",
- "path": "aws-ecs-integ/FargateCluster/DefaultServiceDiscoveryNamespace",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/FargateCluster/DefaultServiceDiscoveryNamespace/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ServiceDiscovery::PrivateDnsNamespace",
- "aws:cdk:cloudformation:props": {
- "name": "aws-ecs-integ",
- "vpc": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_servicediscovery.CfnPrivateDnsNamespace",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_servicediscovery.PrivateDnsNamespace",
- "version": "0.0.0",
- "metadata": [
- {
- "name": "*",
- "vpc": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*",
- "desiredCapacity": "*",
- "minCapacity": "*",
- "maxCapacity": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- },
- {
- "addDefaultCloudMapNamespace": [
- {
- "name": "*"
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ/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-ecs-integ/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-ecs-integ/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": "nginx",
- "memory": 512,
- "memoryReservation": 32,
- "name": "nginx",
- "portMappings": [
- {
- "containerPort": 80,
- "hostPort": 0,
- "protocol": "tcp"
- }
- ]
- },
- {
- "essential": true,
- "image": "nathanpeck/name",
- "memory": 512,
- "memoryReservation": 32,
- "name": "name",
- "portMappings": [
- {
- "containerPort": 81,
- "hostPort": 0,
- "protocol": "tcp"
- }
- ],
- "environment": [
- {
- "name": "PORT",
- "value": "81"
- }
- ]
- }
- ],
- "family": "awsecsintegTaskDef6FDFB69A",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "nginx": {
- "id": "nginx",
- "path": "aws-ecs-integ/TaskDef/nginx",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "name": {
- "id": "name",
- "path": "aws-ecs-integ/TaskDef/name",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*"
- ]
- }
- },
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ/Service",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ/Service/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "FargateCluster7CCD5F93"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "desiredCount": 3,
- "enableEcsManagedTags": false,
- "launchType": "EC2",
- "schedulingStrategy": "REPLICA",
- "serviceRegistries": [
- {
- "registryArn": {
- "Fn::GetAtt": [
- "ServiceCloudmapService046058A4",
- "Arn"
- ]
- },
- "containerName": "name",
- "containerPort": 81
- }
- ],
- "taskDefinition": {
- "Ref": "TaskDef54694570"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- },
- "CloudmapService": {
- "id": "CloudmapService",
- "path": "aws-ecs-integ/Service/CloudmapService",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/Service/CloudmapService/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ServiceDiscovery::Service",
- "aws:cdk:cloudformation:props": {
- "dnsConfig": {
- "dnsRecords": [
- {
- "type": "SRV",
- "ttl": 60
- }
- ],
- "namespaceId": {
- "Fn::GetAtt": [
- "FargateClusterDefaultServiceDiscoveryNamespace04381E1E",
- "Id"
- ]
- },
- "routingPolicy": "MULTIVALUE"
- },
- "healthCheckCustomConfig": {
- "failureThreshold": 1
- },
- "namespaceId": {
- "Fn::GetAtt": [
- "FargateClusterDefaultServiceDiscoveryNamespace04381E1E",
- "Id"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_servicediscovery.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_servicediscovery.Service",
- "version": "0.0.0",
- "metadata": [
- {
- "namespace": "*",
- "name": "*",
- "dnsRecordType": "SRV",
- "customHealthCheck": {
- "failureThreshold": "*"
- },
- "dnsTtl": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ":{"id":"aws-ecs-integ","path":"aws-ecs-integ","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"restrictDefaultSecurityGroup":false,"maxAzs":"*","subnetConfiguration":[{"name":"*","cidrMask":"*","subnetType":"Public"}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"pubSubnet1":{"id":"pubSubnet1","path":"aws-ecs-integ/Vpc/pubSubnet1","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":"*"},{}]},"children":{"Subnet":{"id":"Subnet","path":"aws-ecs-integ/Vpc/pubSubnet1/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/24","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"pub"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"aws-ecs-integ/Vpc/pubSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/pubSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/Vpc/pubSubnet1/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-ecs-integ/Vpc/pubSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/Vpc/pubSubnet1/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":"VpcpubSubnet1RouteTableE0483FDA"},"subnetId":{"Ref":"VpcpubSubnet1Subnet410C08CF"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/Vpc/pubSubnet1/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcpubSubnet1RouteTableE0483FDA"}}}}}},"pubSubnet2":{"id":"pubSubnet2","path":"aws-ecs-integ/Vpc/pubSubnet2","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":"*"},{}]},"children":{"Subnet":{"id":"Subnet","path":"aws-ecs-integ/Vpc/pubSubnet2/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.1.0/24","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"pub"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"aws-ecs-integ/Vpc/pubSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/pubSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/Vpc/pubSubnet2/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-ecs-integ/Vpc/pubSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/Vpc/pubSubnet2/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":"VpcpubSubnet2RouteTable5A29DF40"},"subnetId":{"Ref":"VpcpubSubnet2Subnet44A37A0D"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/Vpc/pubSubnet2/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcpubSubnet2RouteTable5A29DF40"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"FargateCluster":{"id":"FargateCluster","path":"aws-ecs-integ/FargateCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addCapacity":["*",{"instanceType":"*","desiredCapacity":"*","minCapacity":"*","maxCapacity":"*"}]},{"addAutoScalingGroup":["*",{"machineImageType":0}]},{"addDefaultCloudMapNamespace":[{"name":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/FargateCluster/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":{}}},"capacity":{"id":"capacity","path":"aws-ecs-integ/FargateCluster/capacity","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","instanceType":"*","desiredCapacity":"*","minCapacity":"*","maxCapacity":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-ecs-integ/FargateCluster/capacity/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true},{"addIngressRule":[{"canInlineRule":true,"connections":"*","uniqueId":"*"},{},"*",false]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/FargateCluster/capacity/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-ecs-integ/FargateCluster/capacity/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"securityGroupIngress":[{"cidrIp":"0.0.0.0/0","ipProtocol":"tcp","fromPort":32768,"toPort":61000,"description":"from 0.0.0.0/0:32768-61000"}],"tags":[{"key":"Name","value":"aws-ecs-integ/FargateCluster/capacity"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ/FargateCluster/capacity/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-ecs-integ/FargateCluster/capacity/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/FargateCluster/capacity/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-ecs-integ/FargateCluster/capacity"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/FargateCluster/capacity/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-ecs-integ/FargateCluster/capacity/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":["FargateCluster7CCD5F93","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["FargateCluster7CCD5F93","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"FargateClustercapacityInstanceRoleDefaultPolicy90B38927","roles":[{"Ref":"FargateClustercapacityInstanceRoleBE253D2D"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-ecs-integ/FargateCluster/capacity/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":"FargateClustercapacityInstanceRoleBE253D2D"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-ecs-integ/FargateCluster/capacity/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ/FargateCluster/capacity/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-ecs-integ/FargateCluster/capacity/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":["FargateClustercapacityInstanceProfile8294296C","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t3.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["FargateClustercapacityInstanceSecurityGroupCB3AEDA1","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-ecs-integ/FargateCluster/capacity/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ/FargateCluster/capacity/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"FargateCluster7CCD5F93"}," >> /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-ecs-integ/FargateCluster/capacity/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ/FargateCluster/capacity/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":{"desiredCapacity":"1","launchTemplate":{"launchTemplateId":{"Ref":"FargateClustercapacityLaunchTemplateD01E44DB"},"version":{"Fn::GetAtt":["FargateClustercapacityLaunchTemplateD01E44DB","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"aws-ecs-integ/FargateCluster/capacity","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcpubSubnet1Subnet410C08CF"},{"Ref":"VpcpubSubnet2Subnet44A37A0D"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ/FargateCluster/capacity/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ/FargateCluster/capacity/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-ecs-integ/FargateCluster/capacity/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-ecs-integ/FargateCluster/capacity/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/FargateCluster/capacity/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-ecs-integ/FargateCluster/capacity"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/FargateCluster/capacity/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-ecs-integ/FargateCluster/capacity/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":"FargateClustercapacityASGE4034F96"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["FargateCluster7CCD5F93","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["FargateCluster7CCD5F93","Arn"]}}],"Version":"2012-10-17"},"policyName":"FargateClustercapacityDrainECSHookFunctionServiceRoleDefaultPolicy53CD1145","roles":[{"Ref":"FargateClustercapacityDrainECSHookFunctionServiceRoleA28505D9"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ/FargateCluster/capacity/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":"FargateCluster7CCD5F93"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["FargateClustercapacityDrainECSHookFunctionServiceRoleA28505D9","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-ecs-integ/FargateCluster/capacity"}],"timeout":310}}},"AllowInvoke:awsecsintegFargateClustercapacityLifecycleHookDrainHookTopic07C1229F":{"id":"AllowInvoke:awsecsintegFargateClustercapacityLifecycleHookDrainHookTopic07C1229F","path":"aws-ecs-integ/FargateCluster/capacity/DrainECSHook/Function/AllowInvoke:awsecsintegFargateClustercapacityLifecycleHookDrainHookTopic07C1229F","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":["FargateClustercapacityDrainECSHookFunction3E60E6D0","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"FargateClustercapacityLifecycleHookDrainHookTopic390A0E34"}}}},"Topic":{"id":"Topic","path":"aws-ecs-integ/FargateCluster/capacity/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-ecs-integ/FargateCluster/capacity/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":["FargateClustercapacityDrainECSHookFunction3E60E6D0","Arn"]},"protocol":"lambda","topicArn":{"Ref":"FargateClustercapacityLifecycleHookDrainHookTopic390A0E34"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-ecs-integ/FargateCluster/capacity/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-ecs-integ/FargateCluster/capacity/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/FargateCluster/capacity/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-ecs-integ/FargateCluster/capacity"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ/FargateCluster/capacity/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-ecs-integ/FargateCluster/capacity/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/FargateCluster/capacity/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-ecs-integ/FargateCluster/capacity"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/FargateCluster/capacity/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-ecs-integ/FargateCluster/capacity/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":"FargateClustercapacityLifecycleHookDrainHookTopic390A0E34"}}],"Version":"2012-10-17"},"policyName":"FargateClustercapacityLifecycleHookDrainHookRoleDefaultPolicyACCDDB70","roles":[{"Ref":"FargateClustercapacityLifecycleHookDrainHookRoleDD26E39B"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ/FargateCluster/capacity/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":"FargateClustercapacityASGE4034F96"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"FargateClustercapacityLifecycleHookDrainHookTopic390A0E34"},"roleArn":{"Fn::GetAtt":["FargateClustercapacityLifecycleHookDrainHookRoleDD26E39B","Arn"]}}}}}}}},"DefaultServiceDiscoveryNamespace":{"id":"DefaultServiceDiscoveryNamespace","path":"aws-ecs-integ/FargateCluster/DefaultServiceDiscoveryNamespace","constructInfo":{"fqn":"aws-cdk-lib.aws_servicediscovery.PrivateDnsNamespace","version":"0.0.0","metadata":[{"name":"*","vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/FargateCluster/DefaultServiceDiscoveryNamespace/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_servicediscovery.CfnPrivateDnsNamespace","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ServiceDiscovery::PrivateDnsNamespace","aws:cdk:cloudformation:props":{"name":"aws-ecs-integ","vpc":{"Ref":"Vpc8378EB38"}}}}}}}},"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-ecs-integ/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-ecs-integ/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-ecs-integ/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/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":"nginx","memory":512,"memoryReservation":32,"name":"nginx","portMappings":[{"containerPort":80,"hostPort":0,"protocol":"tcp"}]},{"essential":true,"image":"nathanpeck/name","memory":512,"memoryReservation":32,"name":"name","portMappings":[{"containerPort":81,"hostPort":0,"protocol":"tcp"}],"environment":[{"name":"PORT","value":"81"}]}],"family":"awsecsintegTaskDef6FDFB69A","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"nginx":{"id":"nginx","path":"aws-ecs-integ/TaskDef/nginx","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}},"name":{"id":"name","path":"aws-ecs-integ/TaskDef/name","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"Service":{"id":"Service","path":"aws-ecs-integ/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ/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":"FargateCluster7CCD5F93"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"desiredCount":3,"enableEcsManagedTags":false,"launchType":"EC2","schedulingStrategy":"REPLICA","serviceRegistries":[{"registryArn":{"Fn::GetAtt":["ServiceCloudmapService046058A4","Arn"]},"containerName":"name","containerPort":81}],"taskDefinition":{"Ref":"TaskDef54694570"}}}},"CloudmapService":{"id":"CloudmapService","path":"aws-ecs-integ/Service/CloudmapService","constructInfo":{"fqn":"aws-cdk-lib.aws_servicediscovery.Service","version":"0.0.0","metadata":[{"namespace":"*","name":"*","dnsRecordType":"SRV","customHealthCheck":{"failureThreshold":"*"},"dnsTtl":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/Service/CloudmapService/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_servicediscovery.CfnService","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ServiceDiscovery::Service","aws:cdk:cloudformation:props":{"dnsConfig":{"dnsRecords":[{"type":"SRV","ttl":60}],"namespaceId":{"Fn::GetAtt":["FargateClusterDefaultServiceDiscoveryNamespace04381E1E","Id"]},"routingPolicy":"MULTIVALUE"},"healthCheckCustomConfig":{"failureThreshold":1},"namespaceId":{"Fn::GetAtt":["FargateClusterDefaultServiceDiscoveryNamespace04381E1E","Id"]}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ/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.default-capacity-provider.js.snapshot/CapacityProvidersDefaultTestDeployAssert30F9785A.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/CapacityProvidersDefaultTestDeployAssert30F9785A.assets.json
index 7abc5c03c44c4..1f3abcc286091 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/CapacityProvidersDefaultTestDeployAssert30F9785A.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/CapacityProvidersDefaultTestDeployAssert30F9785A.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "CapacityProvidersDefaultTestDeployAssert30F9785A Template",
"source": {
"path": "CapacityProvidersDefaultTestDeployAssert30F9785A.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/integ-default-capacity-provider.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/integ-default-capacity-provider.assets.json
index c7c35aaf38c56..e306da4329bc0 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/integ-default-capacity-provider.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/integ-default-capacity-provider.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "ee35684709b3783622c3c6dfcded3016089092f84844d8ee5adf9138d9a8fa8b": {
+ "5f0498270cdf5af182edc797f21ffd59c44b13bbd2dd6ae47b81f9883bf85390": {
+ "displayName": "integ-default-capacity-provider Template",
"source": {
"path": "integ-default-capacity-provider.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-41372a21": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "ee35684709b3783622c3c6dfcded3016089092f84844d8ee5adf9138d9a8fa8b.json",
+ "objectKey": "5f0498270cdf5af182edc797f21ffd59c44b13bbd2dd6ae47b81f9883bf85390.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/integ-default-capacity-provider.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/integ-default-capacity-provider.template.json
index 0c154d458d63f..0bb8061497613 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/integ-default-capacity-provider.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/integ-default-capacity-provider.template.json
@@ -790,7 +790,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -806,7 +806,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/integ.json
index e65290dcef3ef..24c6a03a082ef 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"CapacityProviders/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "CapacityProviders/DefaultTest/DeployAssert",
"assertionStackName": "CapacityProvidersDefaultTestDeployAssert30F9785A"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/manifest.json
index 129022b2e4043..188da436e0e82 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"integ-default-capacity-provider.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/ee35684709b3783622c3c6dfcded3016089092f84844d8ee5adf9138d9a8fa8b.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/5f0498270cdf5af182edc797f21ffd59c44b13bbd2dd6ae47b81f9883bf85390.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1004,51 +1004,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole00371FEB3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole00371FEB3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole17E852E01": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole17E852E01",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole22C962AF2": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole22C962AF2",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole3E4846C2B": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole3E4846C2B",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole48434A97B": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole48434A97B",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "integ-default-capacity-provider"
@@ -1106,6 +1061,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/tree.json
index 7a45668fb129f..32ae80bba1203 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.default-capacity-provider.js.snapshot/tree.json
@@ -1,2201 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "integ-default-capacity-provider": {
- "id": "integ-default-capacity-provider",
- "path": "integ-default-capacity-provider",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "integ-default-capacity-provider/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/Vpc/Resource",
- "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": "integ-default-capacity-provider/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet1/Subnet",
- "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": "integ-default-capacity-provider/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-default-capacity-provider/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "integ-default-capacity-provider/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "integ-default-capacity-provider/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet2/Subnet",
- "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": "integ-default-capacity-provider/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-default-capacity-provider/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "integ-default-capacity-provider/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "integ-default-capacity-provider/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "integ-default-capacity-provider/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "integ-default-capacity-provider/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-default-capacity-provider/Vpc/PrivateSubnet1/Subnet",
- "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": "integ-default-capacity-provider/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-default-capacity-provider/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-default-capacity-provider/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-default-capacity-provider/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-default-capacity-provider/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-default-capacity-provider/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "integ-default-capacity-provider/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-default-capacity-provider/Vpc/PrivateSubnet2/Subnet",
- "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": "integ-default-capacity-provider/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-default-capacity-provider/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-default-capacity-provider/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-default-capacity-provider/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-default-capacity-provider/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-default-capacity-provider/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "integ-default-capacity-provider/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-default-capacity-provider/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "integ-default-capacity-provider/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "TaskDef": {
- "id": "TaskDef",
- "path": "integ-default-capacity-provider/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "integ-default-capacity-provider/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "integ-default-capacity-provider/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "memoryReservation": 256,
- "name": "web"
- }
- ],
- "family": "integdefaultcapacityproviderTaskDefE3B336CC",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "web": {
- "id": "web",
- "path": "integ-default-capacity-provider/TaskDef/web",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*"
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "integ-default-capacity-provider/ASG",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "integ-default-capacity-provider/ASG/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/ASG/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "integ-default-capacity-provider/ASG/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "integ-default-capacity-provider/ASG"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "integ-default-capacity-provider/ASG/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "integ-default-capacity-provider/ASG/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/ASG/InstanceRole/Resource",
- "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": "integ-default-capacity-provider/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "integ-default-capacity-provider/ASG/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/ASG/InstanceRole/DefaultPolicy/Resource",
- "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": [
- "EC2CPClusterD5F0FD32",
- "Arn"
- ]
- }
- },
- {
- "Action": [
- "ecs:Poll",
- "ecs:StartTelemetrySession"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "EC2CPClusterD5F0FD32",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecr:GetAuthorizationToken",
- "ecs:DiscoverPollEndpoint",
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ASGInstanceRoleDefaultPolicy7636D8BF",
- "roles": [
- {
- "Ref": "ASGInstanceRoleE263A41B"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "integ-default-capacity-provider/ASG/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "ASGInstanceRoleE263A41B"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "integ-default-capacity-provider/ASG/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "integ-default-capacity-provider/ASG/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/ASG/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "ASGInstanceProfile0A2834D7",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "t2.micro",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "ASGInstanceSecurityGroup0525485D",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "integ-default-capacity-provider/ASG/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "integ-default-capacity-provider/ASG/LaunchTemplate"
- }
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "#!/bin/bash\necho ECS_CLUSTER=",
- {
- "Ref": "EC2CPClusterD5F0FD32"
- },
- " >> /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": "integ-default-capacity-provider/ASG/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "integ-default-capacity-provider/ASG/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "ASGLaunchTemplate0CA92847"
- },
- "version": {
- "Fn::GetAtt": [
- "ASGLaunchTemplate0CA92847",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "1",
- "minSize": "1",
- "tags": [
- {
- "key": "Name",
- "value": "integ-default-capacity-provider/ASG",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "integ-default-capacity-provider/ASG/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "integ-default-capacity-provider/ASG/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "integ-default-capacity-provider/ASG/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "integ-default-capacity-provider/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/ASG/DrainECSHook/Function/ServiceRole/Resource",
- "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": "integ-default-capacity-provider/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "integ-default-capacity-provider/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "ASG46ED3070"
- }
- ]
- ]
- }
- },
- {
- "Action": [
- "ecs:DescribeContainerInstances",
- "ecs:DescribeTasks",
- "ecs:ListTasks",
- "ecs:UpdateContainerInstancesState"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "EC2CPClusterD5F0FD32",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecs:ListContainerInstances",
- "ecs:SubmitContainerStateChange",
- "ecs:SubmitTaskStateChange"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "EC2CPClusterD5F0FD32",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27",
- "roles": [
- {
- "Ref": "ASGDrainECSHookFunctionServiceRoleC12963BB"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/ASG/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": "EC2CPClusterD5F0FD32"
- }
- }
- },
- "handler": "index.lambda_handler",
- "role": {
- "Fn::GetAtt": [
- "ASGDrainECSHookFunctionServiceRoleC12963BB",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "integ-default-capacity-provider/ASG"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:integdefaultcapacityproviderASGLifecycleHookDrainHookTopicB8CF8925": {
- "id": "AllowInvoke:integdefaultcapacityproviderASGLifecycleHookDrainHookTopicB8CF8925",
- "path": "integ-default-capacity-provider/ASG/DrainECSHook/Function/AllowInvoke:integdefaultcapacityproviderASGLifecycleHookDrainHookTopicB8CF8925",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "ASGDrainECSHookFunction5F24CF4D",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "integ-default-capacity-provider/ASG/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/ASG/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "ASGDrainECSHookFunction5F24CF4D",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "integ-default-capacity-provider/ASG/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "integ-default-capacity-provider/ASG/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/ASG/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-default-capacity-provider/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "integ-default-capacity-provider/ASG/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "integ-default-capacity-provider/ASG/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/ASG/LifecycleHookDrainHook/Role/Resource",
- "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": "integ-default-capacity-provider/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "integ-default-capacity-provider/ASG/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/ASG/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57",
- "roles": [
- {
- "Ref": "ASGLifecycleHookDrainHookRoleD640316C"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/ASG/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "ASG46ED3070"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "ASGLifecycleHookDrainHookRoleD640316C",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "instanceType": "*",
- "machineImage": "*"
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- },
- "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": "integ-default-capacity-provider/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": "integ-default-capacity-provider/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": []
- }
- },
- "EC2CapacityProvider": {
- "id": "EC2CapacityProvider",
- "path": "integ-default-capacity-provider/EC2CapacityProvider",
- "children": {
- "EC2CapacityProvider": {
- "id": "EC2CapacityProvider",
- "path": "integ-default-capacity-provider/EC2CapacityProvider/EC2CapacityProvider",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::CapacityProvider",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupProvider": {
- "autoScalingGroupArn": {
- "Ref": "ASG46ED3070"
- },
- "managedScaling": {
- "status": "ENABLED",
- "targetCapacity": 100,
- "instanceWarmupPeriod": 301
- },
- "managedTerminationProtection": "DISABLED"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCapacityProvider",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.AsgCapacityProvider",
- "version": "0.0.0"
- }
- },
- "EC2CPCluster": {
- "id": "EC2CPCluster",
- "path": "integ-default-capacity-provider/EC2CPCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-default-capacity-provider/EC2CPCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "EC2CPCluster": {
- "id": "EC2CPCluster",
- "path": "integ-default-capacity-provider/EC2CPCluster/EC2CPCluster",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::ClusterCapacityProviderAssociations",
- "aws:cdk:cloudformation:props": {
- "capacityProviders": [
- "FARGATE",
- "FARGATE_SPOT",
- {
- "Ref": "EC2CapacityProvider5A2E35CD"
- }
- ],
- "cluster": {
- "Ref": "EC2CPClusterD5F0FD32"
- },
- "defaultCapacityProviderStrategy": [
- {
- "capacityProvider": "FARGATE",
- "base": 1,
- "weight": 1
- },
- {
- "capacityProvider": "FARGATE_SPOT",
- "weight": 1
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "enableFargateCapacityProviders": true
- },
- {
- "enableFargateCapacityProviders": []
- },
- {
- "addAsgCapacityProvider": [
- "*"
- ]
- },
- {
- "addDefaultCapacityProviderStrategy": [
- [
- {
- "capacityProvider": "*",
- "base": "*",
- "weight": "*"
- },
- {
- "capacityProvider": "*",
- "weight": "*"
- }
- ]
- ]
- }
- ]
- }
- },
- "EC2Service": {
- "id": "EC2Service",
- "path": "integ-default-capacity-provider/EC2Service",
- "children": {
- "Service": {
- "id": "Service",
- "path": "integ-default-capacity-provider/EC2Service/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EC2CPClusterD5F0FD32"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "launchType": "EC2",
- "schedulingStrategy": "REPLICA",
- "taskDefinition": {
- "Ref": "TaskDef54694570"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "integ-default-capacity-provider/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "integ-default-capacity-provider/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "CapacityProviders": {
- "id": "CapacityProviders",
- "path": "CapacityProviders",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "CapacityProviders/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "CapacityProviders/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "CapacityProviders/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "CapacityProviders/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "CapacityProviders/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"integ-default-capacity-provider":{"id":"integ-default-capacity-provider","path":"integ-default-capacity-provider","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"integ-default-capacity-provider/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"integ-default-capacity-provider/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":"integ-default-capacity-provider/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"integ-default-capacity-provider/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":"integ-default-capacity-provider/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":"integ-default-capacity-provider/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-default-capacity-provider/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-default-capacity-provider/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":"integ-default-capacity-provider/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-default-capacity-provider/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-default-capacity-provider/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"integ-default-capacity-provider/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":"integ-default-capacity-provider/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"integ-default-capacity-provider/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"integ-default-capacity-provider/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"integ-default-capacity-provider/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":"integ-default-capacity-provider/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":"integ-default-capacity-provider/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-default-capacity-provider/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-default-capacity-provider/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":"integ-default-capacity-provider/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-default-capacity-provider/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-default-capacity-provider/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"integ-default-capacity-provider/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":"integ-default-capacity-provider/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"integ-default-capacity-provider/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"integ-default-capacity-provider/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"integ-default-capacity-provider/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":"integ-default-capacity-provider/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":"integ-default-capacity-provider/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-default-capacity-provider/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-default-capacity-provider/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":"integ-default-capacity-provider/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-default-capacity-provider/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-default-capacity-provider/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"integ-default-capacity-provider/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":"integ-default-capacity-provider/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":"integ-default-capacity-provider/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-default-capacity-provider/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-default-capacity-provider/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":"integ-default-capacity-provider/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-default-capacity-provider/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-default-capacity-provider/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"integ-default-capacity-provider/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":"integ-default-capacity-provider/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"integ-default-capacity-provider/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"TaskDef":{"id":"TaskDef","path":"integ-default-capacity-provider/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"integ-default-capacity-provider/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"integ-default-capacity-provider/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-default-capacity-provider/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":"integ-default-capacity-provider/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","memoryReservation":256,"name":"web"}],"family":"integdefaultcapacityproviderTaskDefE3B336CC","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"integ-default-capacity-provider/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"ASG":{"id":"ASG","path":"integ-default-capacity-provider/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","instanceType":"*","machineImage":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"integ-default-capacity-provider/ASG/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"integ-default-capacity-provider/ASG/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":"integ-default-capacity-provider/ASG/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"integ-default-capacity-provider/ASG"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"integ-default-capacity-provider/ASG/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":"integ-default-capacity-provider/ASG/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-default-capacity-provider/ASG/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":"integ-default-capacity-provider/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-default-capacity-provider/ASG/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":"integ-default-capacity-provider/ASG/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":["EC2CPClusterD5F0FD32","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ASGInstanceRoleDefaultPolicy7636D8BF","roles":[{"Ref":"ASGInstanceRoleE263A41B"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"integ-default-capacity-provider/ASG/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":"ASGInstanceRoleE263A41B"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"integ-default-capacity-provider/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"integ-default-capacity-provider/ASG/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":"integ-default-capacity-provider/ASG/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":["ASGInstanceProfile0A2834D7","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ASGInstanceSecurityGroup0525485D","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"integ-default-capacity-provider/ASG/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"integ-default-capacity-provider/ASG/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"EC2CPClusterD5F0FD32"}," >> /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":"integ-default-capacity-provider/ASG/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"integ-default-capacity-provider/ASG/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":"ASGLaunchTemplate0CA92847"},"version":{"Fn::GetAtt":["ASGLaunchTemplate0CA92847","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"integ-default-capacity-provider/ASG","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"integ-default-capacity-provider/ASG/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"integ-default-capacity-provider/ASG/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":"integ-default-capacity-provider/ASG/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":"integ-default-capacity-provider/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-default-capacity-provider/ASG/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":"integ-default-capacity-provider/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-default-capacity-provider/ASG/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":"integ-default-capacity-provider/ASG/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":"ASG46ED3070"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}],"Version":"2012-10-17"},"policyName":"ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27","roles":[{"Ref":"ASGDrainECSHookFunctionServiceRoleC12963BB"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-default-capacity-provider/ASG/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":"EC2CPClusterD5F0FD32"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ASGDrainECSHookFunctionServiceRoleC12963BB","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"integ-default-capacity-provider/ASG"}],"timeout":310}}},"AllowInvoke:integdefaultcapacityproviderASGLifecycleHookDrainHookTopicB8CF8925":{"id":"AllowInvoke:integdefaultcapacityproviderASGLifecycleHookDrainHookTopicB8CF8925","path":"integ-default-capacity-provider/ASG/DrainECSHook/Function/AllowInvoke:integdefaultcapacityproviderASGLifecycleHookDrainHookTopicB8CF8925","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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}},"Topic":{"id":"Topic","path":"integ-default-capacity-provider/ASG/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":"integ-default-capacity-provider/ASG/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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"integ-default-capacity-provider/ASG/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":"integ-default-capacity-provider/ASG/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"integ-default-capacity-provider/ASG/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":"integ-default-capacity-provider/ASG"}]}}}}},"Role":{"id":"Role","path":"integ-default-capacity-provider/ASG/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":"integ-default-capacity-provider/ASG/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-default-capacity-provider/ASG/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":"integ-default-capacity-provider/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-default-capacity-provider/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"integ-default-capacity-provider/ASG/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":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}],"Version":"2012-10-17"},"policyName":"ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57","roles":[{"Ref":"ASGLifecycleHookDrainHookRoleD640316C"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-default-capacity-provider/ASG/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":"ASG46ED3070"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"},"roleArn":{"Fn::GetAtt":["ASGLifecycleHookDrainHookRoleD640316C","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":"integ-default-capacity-provider/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":"integ-default-capacity-provider/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":[]}},"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-default-capacity-provider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.AsgCapacityProvider","version":"0.0.0"},"children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-default-capacity-provider/EC2CapacityProvider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCapacityProvider","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::CapacityProvider","aws:cdk:cloudformation:props":{"autoScalingGroupProvider":{"autoScalingGroupArn":{"Ref":"ASG46ED3070"},"managedScaling":{"status":"ENABLED","targetCapacity":100,"instanceWarmupPeriod":301},"managedTerminationProtection":"DISABLED"}}}}}},"EC2CPCluster":{"id":"EC2CPCluster","path":"integ-default-capacity-provider/EC2CPCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*","enableFargateCapacityProviders":true},{"enableFargateCapacityProviders":[]},{"addAsgCapacityProvider":["*"]},{"addDefaultCapacityProviderStrategy":[[{"capacityProvider":"*","base":"*","weight":"*"},{"capacityProvider":"*","weight":"*"}]]}]},"children":{"Resource":{"id":"Resource","path":"integ-default-capacity-provider/EC2CPCluster/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":{}}},"EC2CPCluster":{"id":"EC2CPCluster","path":"integ-default-capacity-provider/EC2CPCluster/EC2CPCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":["FARGATE","FARGATE_SPOT",{"Ref":"EC2CapacityProvider5A2E35CD"}],"cluster":{"Ref":"EC2CPClusterD5F0FD32"},"defaultCapacityProviderStrategy":[{"capacityProvider":"FARGATE","base":1,"weight":1},{"capacityProvider":"FARGATE_SPOT","weight":1}]}}}}},"EC2Service":{"id":"EC2Service","path":"integ-default-capacity-provider/EC2Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"integ-default-capacity-provider/EC2Service/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":"EC2CPClusterD5F0FD32"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"launchType":"EC2","schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"integ-default-capacity-provider/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"integ-default-capacity-provider/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"CapacityProviders":{"id":"CapacityProviders","path":"CapacityProviders","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"CapacityProviders/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"CapacityProviders/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"CapacityProviders/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"CapacityProviders/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"CapacityProviders/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.deployment-alarms.js.snapshot/DeploymentAlarmsDefaultTestDeployAssertAFB973D1.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/DeploymentAlarmsDefaultTestDeployAssertAFB973D1.assets.json
index c49a6a9f10395..0a7c40b845a72 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/DeploymentAlarmsDefaultTestDeployAssertAFB973D1.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/DeploymentAlarmsDefaultTestDeployAssertAFB973D1.assets.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
"displayName": "DeploymentAlarmsDefaultTestDeployAssertAFB973D1 Template",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/cdk.out
index 3704a1b682acf..523a9aac37cbf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.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.deployment-alarms.js.snapshot/integ-deployment-alarms.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/integ-deployment-alarms.assets.json
index 950a3214b4606..a4899c35ab812 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/integ-deployment-alarms.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/integ-deployment-alarms.assets.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"files": {
"a1acfc2b5f4f6b183fd2bb9863f486bc5edef6a357b355a070d9a0e502df418c": {
"displayName": "integ-deployment-alarms/Custom::VpcRestrictDefaultSGCustomResourceProvider Code",
@@ -15,16 +15,16 @@
}
}
},
- "0bc5b6f06ce138abaff640361dbad2643d095d5ce82cfde747bab3a1eabecf2a": {
+ "edc0269f1551953cc2583676632344f5898cc7c28ca4fcdeab3375d542785496": {
"displayName": "integ-deployment-alarms Template",
"source": {
"path": "integ-deployment-alarms.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region-a6113913": {
+ "current_account-current_region-69ec1ec2": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "0bc5b6f06ce138abaff640361dbad2643d095d5ce82cfde747bab3a1eabecf2a.json",
+ "objectKey": "edc0269f1551953cc2583676632344f5898cc7c28ca4fcdeab3375d542785496.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/integ-deployment-alarms.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/integ-deployment-alarms.template.json
index e60a31632c672..40a50f94f29b7 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/integ-deployment-alarms.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/integ-deployment-alarms.template.json
@@ -913,7 +913,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -929,7 +929,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/integ.json
index f57e1d2777035..5c0f7dc2dc82a 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"testCases": {
"DeploymentAlarms/DefaultTest": {
"stacks": [
@@ -9,5 +9,5 @@
"assertionStackName": "DeploymentAlarmsDefaultTestDeployAssertAFB973D1"
}
},
- "minimumCliVersion": "2.1020.2"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/manifest.json
index 74ea73883a5ad..c553685af7964 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/manifest.json
@@ -18,7 +18,7 @@
"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}/0bc5b6f06ce138abaff640361dbad2643d095d5ce82cfde747bab3a1eabecf2a.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/edc0269f1551953cc2583676632344f5898cc7c28ca4fcdeab3375d542785496.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1091,57 +1091,44 @@
"properties": {
"module": "aws-cdk-lib",
"flags": {
- "@aws-cdk/core:enableStackNameDuplicates": {
+ "@aws-cdk/aws-signer:signingProfileNamePassedToCfn": {
"recommendedValue": true,
- "explanation": "Allow multiple stacks with the same name"
- },
- "aws-cdk:enableDiffNoFail": {
- "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"
- },
- "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
- "recommendedValue": true,
- "explanation": "Do not specify a default DesiredCount for ECS services"
+ "explanation": "Name exports based on the construct paths relative to the stack, rather than the global construct path",
+ "unconfiguredBehavesLike": {
+ "v2": true
+ }
},
"@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,
@@ -1150,7 +1137,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,
@@ -1371,7 +1361,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,
@@ -1400,7 +1393,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,
@@ -1464,7 +1460,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,
@@ -1498,7 +1497,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,
@@ -1521,7 +1523,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,
@@ -1556,5 +1561,5 @@
}
}
},
- "minimumCliVersion": "2.1023.0"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/tree.json
index a273695cbf008..48c9ee168894b 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.deployment-alarms.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":{"integ-deployment-alarms":{"id":"integ-deployment-alarms","path":"integ-deployment-alarms","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"integ-deployment-alarms/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]},"children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"integ-deployment-alarms/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":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-deployment-alarms/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-deployment-alarms/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"integ-deployment-alarms/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"integ-deployment-alarms/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":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-deployment-alarms/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-deployment-alarms/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"integ-deployment-alarms/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"integ-deployment-alarms/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":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-deployment-alarms/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-deployment-alarms/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"integ-deployment-alarms/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":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-deployment-alarms/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-deployment-alarms/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"integ-deployment-alarms/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"integ-deployment-alarms/Vpc/RestrictDefaultSecurityGroupCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"integ-deployment-alarms/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"integ-deployment-alarms/Custom::VpcRestrictDefaultSGCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"integ-deployment-alarms/Custom::VpcRestrictDefaultSGCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"integ-deployment-alarms/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"integ-deployment-alarms/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"TaskDef":{"id":"TaskDef","path":"integ-deployment-alarms/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"integ-deployment-alarms/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"integ-deployment-alarms/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-deployment-alarms/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":"integ-deployment-alarms/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","memoryReservation":256,"name":"web","portMappings":[{"containerPort":80,"hostPort":8080,"protocol":"tcp"}]}],"family":"integdeploymentalarmsTaskDef16B2942D","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"integ-deployment-alarms/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"ASG":{"id":"ASG","path":"integ-deployment-alarms/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","instanceType":"*","machineImage":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"integ-deployment-alarms/ASG/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"integ-deployment-alarms/ASG"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/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":["EC2CPClusterD5F0FD32","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ASGInstanceRoleDefaultPolicy7636D8BF","roles":[{"Ref":"ASGInstanceRoleE263A41B"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"integ-deployment-alarms/ASG/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":"ASGInstanceRoleE263A41B"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"integ-deployment-alarms/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/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":["ASGInstanceProfile0A2834D7","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ASGInstanceSecurityGroup0525485D","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"integ-deployment-alarms/ASG/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"integ-deployment-alarms/ASG/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"EC2CPClusterD5F0FD32"}," >> /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":"integ-deployment-alarms/ASG/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"integ-deployment-alarms/ASG/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":"ASGLaunchTemplate0CA92847"},"version":{"Fn::GetAtt":["ASGLaunchTemplate0CA92847","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"integ-deployment-alarms/ASG","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"integ-deployment-alarms/ASG/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/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":"ASG46ED3070"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}],"Version":"2012-10-17"},"policyName":"ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27","roles":[{"Ref":"ASGDrainECSHookFunctionServiceRoleC12963BB"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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('Got event without EC2InstanceId: %s', 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":"EC2CPClusterD5F0FD32"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ASGDrainECSHookFunctionServiceRoleC12963BB","Arn"]},"runtime":"python3.9","tags":[{"key":"Name","value":"integ-deployment-alarms/ASG"}],"timeout":310}}},"AllowInvoke:integdeploymentalarmsASGLifecycleHookDrainHookTopic48A952B0":{"id":"AllowInvoke:integdeploymentalarmsASGLifecycleHookDrainHookTopic48A952B0","path":"integ-deployment-alarms/ASG/DrainECSHook/Function/AllowInvoke:integdeploymentalarmsASGLifecycleHookDrainHookTopic48A952B0","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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}},"Topic":{"id":"Topic","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG"}]}}}}},"Role":{"id":"Role","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-deployment-alarms/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}],"Version":"2012-10-17"},"policyName":"ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57","roles":[{"Ref":"ASGLifecycleHookDrainHookRoleD640316C"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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":"ASG46ED3070"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"},"roleArn":{"Fn::GetAtt":["ASGLifecycleHookDrainHookRoleD640316C","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":"integ-deployment-alarms/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":"integ-deployment-alarms/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":[]}},"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-deployment-alarms/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.AsgCapacityProvider","version":"0.0.0"},"children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-deployment-alarms/EC2CapacityProvider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCapacityProvider","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::CapacityProvider","aws:cdk:cloudformation:props":{"autoScalingGroupProvider":{"autoScalingGroupArn":{"Ref":"ASG46ED3070"},"managedScaling":{"status":"ENABLED","targetCapacity":100},"managedTerminationProtection":"DISABLED"}}}}}},"EC2CPCluster":{"id":"EC2CPCluster","path":"integ-deployment-alarms/EC2CPCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addAsgCapacityProvider":["*"]}]},"children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/EC2CPCluster/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":{}}},"EC2CPCluster":{"id":"EC2CPCluster","path":"integ-deployment-alarms/EC2CPCluster/EC2CPCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"Ref":"EC2CapacityProvider5A2E35CD"}],"cluster":{"Ref":"EC2CPClusterD5F0FD32"},"defaultCapacityProviderStrategy":[]}}}}},"EC2Service":{"id":"EC2Service","path":"integ-deployment-alarms/EC2Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"integ-deployment-alarms/EC2Service/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":"EC2CPClusterD5F0FD32"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50,"alarms":{"enable":true,"alarmNames":["AlarmCpuUtilization"],"rollback":false}},"enableEcsManagedTags":false,"launchType":"EC2","schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"MyMetricAlarm":{"id":"MyMetricAlarm","path":"integ-deployment-alarms/MyMetricAlarm","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.Alarm","version":"0.0.0","metadata":[{"alarmName":"*","metric":{"warnings":"*"},"evaluationPeriods":"*","threshold":"*","treatMissingData":"notBreaching"}]},"children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/MyMetricAlarm/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.CfnAlarm","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CloudWatch::Alarm","aws:cdk:cloudformation:props":{"alarmName":"AlarmCpuUtilization","comparisonOperator":"GreaterThanOrEqualToThreshold","dimensions":[{"name":"ClusterName","value":{"Ref":"EC2CPClusterD5F0FD32"}},{"name":"ServiceName","value":{"Fn::GetAtt":["EC2Service5392EF94","Name"]}}],"evaluationPeriods":5,"metricName":"CPUUtilization","namespace":"AWS/ECS","period":300,"statistic":"Average","threshold":80,"treatMissingData":"notBreaching"}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"integ-deployment-alarms/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"integ-deployment-alarms/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"DeploymentAlarms":{"id":"DeploymentAlarms","path":"DeploymentAlarms","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"DeploymentAlarms/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"DeploymentAlarms/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"DeploymentAlarms/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"DeploymentAlarms/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"DeploymentAlarms/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
+{"version":"tree-0.1","tree":{"id":"App","path":"","constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.0.0"},"children":{"integ-deployment-alarms":{"id":"integ-deployment-alarms","path":"integ-deployment-alarms","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"integ-deployment-alarms/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]},"children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"integ-deployment-alarms/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":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-deployment-alarms/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-deployment-alarms/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"integ-deployment-alarms/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"integ-deployment-alarms/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":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-deployment-alarms/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-deployment-alarms/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"integ-deployment-alarms/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"integ-deployment-alarms/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":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-deployment-alarms/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-deployment-alarms/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"integ-deployment-alarms/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":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-deployment-alarms/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-deployment-alarms/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"integ-deployment-alarms/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":"integ-deployment-alarms/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"integ-deployment-alarms/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"integ-deployment-alarms/Vpc/RestrictDefaultSecurityGroupCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"integ-deployment-alarms/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"integ-deployment-alarms/Custom::VpcRestrictDefaultSGCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"integ-deployment-alarms/Custom::VpcRestrictDefaultSGCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"integ-deployment-alarms/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"integ-deployment-alarms/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"TaskDef":{"id":"TaskDef","path":"integ-deployment-alarms/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"integ-deployment-alarms/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"integ-deployment-alarms/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-deployment-alarms/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":"integ-deployment-alarms/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","memoryReservation":256,"name":"web","portMappings":[{"containerPort":80,"hostPort":8080,"protocol":"tcp"}]}],"family":"integdeploymentalarmsTaskDef16B2942D","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"integ-deployment-alarms/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"ASG":{"id":"ASG","path":"integ-deployment-alarms/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","instanceType":"*","machineImage":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"integ-deployment-alarms/ASG/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"integ-deployment-alarms/ASG"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/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":["EC2CPClusterD5F0FD32","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ASGInstanceRoleDefaultPolicy7636D8BF","roles":[{"Ref":"ASGInstanceRoleE263A41B"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"integ-deployment-alarms/ASG/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":"ASGInstanceRoleE263A41B"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"integ-deployment-alarms/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/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":["ASGInstanceProfile0A2834D7","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ASGInstanceSecurityGroup0525485D","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"integ-deployment-alarms/ASG/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"integ-deployment-alarms/ASG/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"EC2CPClusterD5F0FD32"}," >> /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":"integ-deployment-alarms/ASG/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"integ-deployment-alarms/ASG/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":"ASGLaunchTemplate0CA92847"},"version":{"Fn::GetAtt":["ASGLaunchTemplate0CA92847","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"integ-deployment-alarms/ASG","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"integ-deployment-alarms/ASG/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/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":"ASG46ED3070"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}],"Version":"2012-10-17"},"policyName":"ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27","roles":[{"Ref":"ASGDrainECSHookFunctionServiceRoleC12963BB"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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":"EC2CPClusterD5F0FD32"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ASGDrainECSHookFunctionServiceRoleC12963BB","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"integ-deployment-alarms/ASG"}],"timeout":310}}},"AllowInvoke:integdeploymentalarmsASGLifecycleHookDrainHookTopic48A952B0":{"id":"AllowInvoke:integdeploymentalarmsASGLifecycleHookDrainHookTopic48A952B0","path":"integ-deployment-alarms/ASG/DrainECSHook/Function/AllowInvoke:integdeploymentalarmsASGLifecycleHookDrainHookTopic48A952B0","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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}},"Topic":{"id":"Topic","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG"}]}}}}},"Role":{"id":"Role","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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":"integ-deployment-alarms/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-deployment-alarms/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}],"Version":"2012-10-17"},"policyName":"ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57","roles":[{"Ref":"ASGLifecycleHookDrainHookRoleD640316C"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/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":"ASG46ED3070"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"},"roleArn":{"Fn::GetAtt":["ASGLifecycleHookDrainHookRoleD640316C","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":"integ-deployment-alarms/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":"integ-deployment-alarms/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":[]}},"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-deployment-alarms/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.AsgCapacityProvider","version":"0.0.0"},"children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-deployment-alarms/EC2CapacityProvider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCapacityProvider","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::CapacityProvider","aws:cdk:cloudformation:props":{"autoScalingGroupProvider":{"autoScalingGroupArn":{"Ref":"ASG46ED3070"},"managedScaling":{"status":"ENABLED","targetCapacity":100},"managedTerminationProtection":"DISABLED"}}}}}},"EC2CPCluster":{"id":"EC2CPCluster","path":"integ-deployment-alarms/EC2CPCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addAsgCapacityProvider":["*"]}]},"children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/EC2CPCluster/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":{}}},"EC2CPCluster":{"id":"EC2CPCluster","path":"integ-deployment-alarms/EC2CPCluster/EC2CPCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"Ref":"EC2CapacityProvider5A2E35CD"}],"cluster":{"Ref":"EC2CPClusterD5F0FD32"},"defaultCapacityProviderStrategy":[]}}}}},"EC2Service":{"id":"EC2Service","path":"integ-deployment-alarms/EC2Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"integ-deployment-alarms/EC2Service/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":"EC2CPClusterD5F0FD32"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50,"alarms":{"enable":true,"alarmNames":["AlarmCpuUtilization"],"rollback":false}},"enableEcsManagedTags":false,"launchType":"EC2","schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"MyMetricAlarm":{"id":"MyMetricAlarm","path":"integ-deployment-alarms/MyMetricAlarm","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.Alarm","version":"0.0.0","metadata":[{"alarmName":"*","metric":{"warnings":"*"},"evaluationPeriods":"*","threshold":"*","treatMissingData":"notBreaching"}]},"children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/MyMetricAlarm/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_cloudwatch.CfnAlarm","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CloudWatch::Alarm","aws:cdk:cloudformation:props":{"alarmName":"AlarmCpuUtilization","comparisonOperator":"GreaterThanOrEqualToThreshold","dimensions":[{"name":"ClusterName","value":{"Ref":"EC2CPClusterD5F0FD32"}},{"name":"ServiceName","value":{"Fn::GetAtt":["EC2Service5392EF94","Name"]}}],"evaluationPeriods":5,"metricName":"CPUUtilization","namespace":"AWS/ECS","period":300,"statistic":"Average","threshold":80,"treatMissingData":"notBreaching"}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"integ-deployment-alarms/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"integ-deployment-alarms/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"DeploymentAlarms":{"id":"DeploymentAlarms","path":"DeploymentAlarms","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"DeploymentAlarms/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"DeploymentAlarms/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"DeploymentAlarms/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"DeploymentAlarms/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"DeploymentAlarms/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.enable-execute-command.js.snapshot/aws-ecs-integ-enable-execute-command.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/aws-ecs-integ-enable-execute-command.assets.json
index f9f3f178a2f5d..381e6c636e25c 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/aws-ecs-integ-enable-execute-command.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/aws-ecs-integ-enable-execute-command.assets.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"files": {
"a1acfc2b5f4f6b183fd2bb9863f486bc5edef6a357b355a070d9a0e502df418c": {
"displayName": "aws-ecs-integ-enable-execute-command/Custom::VpcRestrictDefaultSGCustomResourceProvider Code",
@@ -15,16 +15,16 @@
}
}
},
- "2a582f5c349b2d7404243dc9d44ea5efd1bd345fc49443eed68a829d28e4ed1e": {
+ "335cec934b69cd81b9b0bf01dbb1666ff81ac7be5577852622e60bcc2daf4d06": {
"displayName": "aws-ecs-integ-enable-execute-command Template",
"source": {
"path": "aws-ecs-integ-enable-execute-command.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region-4bfdec68": {
+ "current_account-current_region-16441498": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "2a582f5c349b2d7404243dc9d44ea5efd1bd345fc49443eed68a829d28e4ed1e.json",
+ "objectKey": "335cec934b69cd81b9b0bf01dbb1666ff81ac7be5577852622e60bcc2daf4d06.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/aws-ecs-integ-enable-execute-command.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/aws-ecs-integ-enable-execute-command.template.json
index 0e1231030fe63..caf8b288c6050 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/aws-ecs-integ-enable-execute-command.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/aws-ecs-integ-enable-execute-command.template.json
@@ -984,7 +984,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -1000,7 +1000,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/cdk.out
index 3704a1b682acf..523a9aac37cbf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.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.enable-execute-command.js.snapshot/enableexecutecommandtestDefaultTestDeployAssertDF06DF37.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/enableexecutecommandtestDefaultTestDeployAssertDF06DF37.assets.json
index bf5526566ed47..92e613b9bb47a 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/enableexecutecommandtestDefaultTestDeployAssertDF06DF37.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/enableexecutecommandtestDefaultTestDeployAssertDF06DF37.assets.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
"displayName": "enableexecutecommandtestDefaultTestDeployAssertDF06DF37 Template",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/integ.json
index 5090cf875d091..db6be553512a4 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"testCases": {
"enable-execute-command-test/DefaultTest": {
"stacks": [
@@ -9,5 +9,5 @@
"assertionStackName": "enableexecutecommandtestDefaultTestDeployAssertDF06DF37"
}
},
- "minimumCliVersion": "2.1020.2"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/manifest.json
index 3317c70c3d14c..29a35350e6e32 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/manifest.json
@@ -18,7 +18,7 @@
"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}/2a582f5c349b2d7404243dc9d44ea5efd1bd345fc49443eed68a829d28e4ed1e.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/335cec934b69cd81b9b0bf01dbb1666ff81ac7be5577852622e60bcc2daf4d06.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1215,57 +1215,44 @@
"properties": {
"module": "aws-cdk-lib",
"flags": {
- "@aws-cdk/core:enableStackNameDuplicates": {
+ "@aws-cdk/aws-signer:signingProfileNamePassedToCfn": {
"recommendedValue": true,
- "explanation": "Allow multiple stacks with the same name"
- },
- "aws-cdk:enableDiffNoFail": {
- "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"
- },
- "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
- "recommendedValue": true,
- "explanation": "Do not specify a default DesiredCount for ECS services"
+ "explanation": "Name exports based on the construct paths relative to the stack, rather than the global construct path",
+ "unconfiguredBehavesLike": {
+ "v2": true
+ }
},
"@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,
@@ -1274,7 +1261,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,
@@ -1495,7 +1485,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,
@@ -1524,7 +1517,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,
@@ -1588,7 +1584,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,
@@ -1622,7 +1621,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,
@@ -1645,7 +1647,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,
@@ -1680,5 +1685,5 @@
}
}
},
- "minimumCliVersion": "2.1023.0"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/tree.json
index 5939f6892c56b..97432fc38d607 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.enable-execute-command.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-ecs-integ-enable-execute-command":{"id":"aws-ecs-integ-enable-execute-command","path":"aws-ecs-integ-enable-execute-command","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-enable-execute-command/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-enable-execute-command/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-command/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-enable-execute-command/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-enable-execute-command/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-enable-execute-command/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-command/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-enable-execute-command/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-enable-execute-command/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-enable-execute-command/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-command/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-enable-execute-command/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-enable-execute-command/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-command/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-enable-execute-command/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-enable-execute-command/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"aws-ecs-integ-enable-execute-command/Vpc/RestrictDefaultSecurityGroupCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"aws-ecs-integ-enable-execute-command/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"aws-ecs-integ-enable-execute-command/Custom::VpcRestrictDefaultSGCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-ecs-integ-enable-execute-command/Custom::VpcRestrictDefaultSGCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"aws-ecs-integ-enable-execute-command/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"aws-ecs-integ-enable-execute-command/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"TaskDef":{"id":"TaskDef","path":"aws-ecs-integ-enable-execute-command/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-enable-execute-command/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-enable-execute-command/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-enable-execute-command/TaskDef/TaskRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/TaskDef/TaskRole/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":["s3:GetBucketLocation","ssmmessages:CreateControlChannel","ssmmessages:CreateDataChannel","ssmmessages:OpenControlChannel","ssmmessages:OpenDataChannel"],"Effect":"Allow","Resource":"*"},{"Action":"s3:PutObject","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Ref":"EcsExecBucket4F468651"},"/*"]]}},{"Action":"s3:GetEncryptionConfiguration","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Ref":"EcsExecBucket4F468651"}]]}}],"Version":"2012-10-17"},"policyName":"TaskDefTaskRoleDefaultPolicyA592CB18","roles":[{"Ref":"TaskDefTaskRole1EDB4A67"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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","memoryReservation":256,"name":"web","portMappings":[{"containerPort":80,"hostPort":8080,"protocol":"tcp"}]}],"family":"awsecsintegenableexecutecommandTaskDefE1A02A6B","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"aws-ecs-integ-enable-execute-command/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"EcsExecBucket":{"id":"EcsExecBucket","path":"aws-ecs-integ-enable-execute-command/EcsExecBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.Bucket","version":"0.0.0","metadata":["*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/EcsExecBucket/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucket","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-enable-execute-command/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","instanceType":"*","machineImage":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-ecs-integ-enable-execute-command/ASG/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/ASG"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/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":["EC2CPClusterD5F0FD32","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ASGInstanceRoleDefaultPolicy7636D8BF","roles":[{"Ref":"ASGInstanceRoleE263A41B"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-ecs-integ-enable-execute-command/ASG/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":"ASGInstanceRoleE263A41B"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-ecs-integ-enable-execute-command/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/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":["ASGInstanceProfile0A2834D7","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ASGInstanceSecurityGroup0525485D","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/ASG/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/ASG/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"EC2CPClusterD5F0FD32"}," >> /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-ecs-integ-enable-execute-command/ASG/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-enable-execute-command/ASG/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":"ASGLaunchTemplate0CA92847"},"version":{"Fn::GetAtt":["ASGLaunchTemplate0CA92847","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/ASG","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-enable-execute-command/ASG/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/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":"ASG46ED3070"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}],"Version":"2012-10-17"},"policyName":"ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27","roles":[{"Ref":"ASGDrainECSHookFunctionServiceRoleC12963BB"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/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('Got event without EC2InstanceId: %s', 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":"EC2CPClusterD5F0FD32"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ASGDrainECSHookFunctionServiceRoleC12963BB","Arn"]},"runtime":"python3.9","tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/ASG"}],"timeout":310}}},"AllowInvoke:awsecsintegenableexecutecommandASGLifecycleHookDrainHookTopic82F94397":{"id":"AllowInvoke:awsecsintegenableexecutecommandASGLifecycleHookDrainHookTopic82F94397","path":"aws-ecs-integ-enable-execute-command/ASG/DrainECSHook/Function/AllowInvoke:awsecsintegenableexecutecommandASGLifecycleHookDrainHookTopic82F94397","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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}},"Topic":{"id":"Topic","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/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":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}],"Version":"2012-10-17"},"policyName":"ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57","roles":[{"Ref":"ASGLifecycleHookDrainHookRoleD640316C"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/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":"ASG46ED3070"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"},"roleArn":{"Fn::GetAtt":["ASGLifecycleHookDrainHookRoleD640316C","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-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/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":[]}},"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"aws-ecs-integ-enable-execute-command/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.AsgCapacityProvider","version":"0.0.0"},"children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"aws-ecs-integ-enable-execute-command/EC2CapacityProvider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCapacityProvider","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::CapacityProvider","aws:cdk:cloudformation:props":{"autoScalingGroupProvider":{"autoScalingGroupArn":{"Ref":"ASG46ED3070"},"managedScaling":{"status":"ENABLED","targetCapacity":100},"managedTerminationProtection":"DISABLED"},"name":"cp-aws-ecs-integ-enable-execute-commandEC2CapacityProvider4341E2A3"}}}}},"EC2CPCluster":{"id":"EC2CPCluster","path":"aws-ecs-integ-enable-execute-command/EC2CPCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*","executeCommandConfiguration":{"logConfiguration":{"s3Bucket":"*","s3EncryptionEnabled":true,"s3KeyPrefix":"*"},"logging":"OVERRIDE"}},{"addAsgCapacityProvider":["*"]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/EC2CPCluster/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":{"configuration":{"executeCommandConfiguration":{"logConfiguration":{"s3BucketName":{"Ref":"EcsExecBucket4F468651"},"s3EncryptionEnabled":true,"s3KeyPrefix":"exec-output"},"logging":"OVERRIDE"}}}}},"EC2CPCluster":{"id":"EC2CPCluster","path":"aws-ecs-integ-enable-execute-command/EC2CPCluster/EC2CPCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"Ref":"EC2CapacityProvider5A2E35CD"}],"cluster":{"Ref":"EC2CPClusterD5F0FD32"},"defaultCapacityProviderStrategy":[]}}}}},"EC2Service":{"id":"EC2Service","path":"aws-ecs-integ-enable-execute-command/EC2Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ-enable-execute-command/EC2Service/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":"EC2CPClusterD5F0FD32"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"enableExecuteCommand":true,"launchType":"EC2","schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-enable-execute-command/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-enable-execute-command/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"enable-execute-command-test":{"id":"enable-execute-command-test","path":"enable-execute-command-test","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"enable-execute-command-test/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"enable-execute-command-test/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"enable-execute-command-test/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"enable-execute-command-test/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"enable-execute-command-test/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
+{"version":"tree-0.1","tree":{"id":"App","path":"","constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.0.0"},"children":{"aws-ecs-integ-enable-execute-command":{"id":"aws-ecs-integ-enable-execute-command","path":"aws-ecs-integ-enable-execute-command","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-enable-execute-command/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-enable-execute-command/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-command/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-enable-execute-command/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-enable-execute-command/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-enable-execute-command/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-command/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-enable-execute-command/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-enable-execute-command/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-enable-execute-command/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-command/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-enable-execute-command/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-enable-execute-command/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-command/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-enable-execute-command/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-enable-execute-command/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"aws-ecs-integ-enable-execute-command/Vpc/RestrictDefaultSecurityGroupCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"aws-ecs-integ-enable-execute-command/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"aws-ecs-integ-enable-execute-command/Custom::VpcRestrictDefaultSGCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-ecs-integ-enable-execute-command/Custom::VpcRestrictDefaultSGCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"aws-ecs-integ-enable-execute-command/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"aws-ecs-integ-enable-execute-command/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"TaskDef":{"id":"TaskDef","path":"aws-ecs-integ-enable-execute-command/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-enable-execute-command/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-enable-execute-command/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-enable-execute-command/TaskDef/TaskRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/TaskDef/TaskRole/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":["s3:GetBucketLocation","ssmmessages:CreateControlChannel","ssmmessages:CreateDataChannel","ssmmessages:OpenControlChannel","ssmmessages:OpenDataChannel"],"Effect":"Allow","Resource":"*"},{"Action":"s3:PutObject","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Ref":"EcsExecBucket4F468651"},"/*"]]}},{"Action":"s3:GetEncryptionConfiguration","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Ref":"EcsExecBucket4F468651"}]]}}],"Version":"2012-10-17"},"policyName":"TaskDefTaskRoleDefaultPolicyA592CB18","roles":[{"Ref":"TaskDefTaskRole1EDB4A67"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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","memoryReservation":256,"name":"web","portMappings":[{"containerPort":80,"hostPort":8080,"protocol":"tcp"}]}],"family":"awsecsintegenableexecutecommandTaskDefE1A02A6B","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"aws-ecs-integ-enable-execute-command/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"EcsExecBucket":{"id":"EcsExecBucket","path":"aws-ecs-integ-enable-execute-command/EcsExecBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.Bucket","version":"0.0.0","metadata":["*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/EcsExecBucket/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucket","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-enable-execute-command/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","instanceType":"*","machineImage":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-ecs-integ-enable-execute-command/ASG/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/ASG"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/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":["EC2CPClusterD5F0FD32","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ASGInstanceRoleDefaultPolicy7636D8BF","roles":[{"Ref":"ASGInstanceRoleE263A41B"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-ecs-integ-enable-execute-command/ASG/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":"ASGInstanceRoleE263A41B"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-ecs-integ-enable-execute-command/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/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":["ASGInstanceProfile0A2834D7","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ASGInstanceSecurityGroup0525485D","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/ASG/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/ASG/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"EC2CPClusterD5F0FD32"}," >> /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-ecs-integ-enable-execute-command/ASG/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-enable-execute-command/ASG/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":"ASGLaunchTemplate0CA92847"},"version":{"Fn::GetAtt":["ASGLaunchTemplate0CA92847","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/ASG","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-enable-execute-command/ASG/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/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":"ASG46ED3070"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["EC2CPClusterD5F0FD32","Arn"]}}],"Version":"2012-10-17"},"policyName":"ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27","roles":[{"Ref":"ASGDrainECSHookFunctionServiceRoleC12963BB"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/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":"EC2CPClusterD5F0FD32"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ASGDrainECSHookFunctionServiceRoleC12963BB","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/ASG"}],"timeout":310}}},"AllowInvoke:awsecsintegenableexecutecommandASGLifecycleHookDrainHookTopic82F94397":{"id":"AllowInvoke:awsecsintegenableexecutecommandASGLifecycleHookDrainHookTopic82F94397","path":"aws-ecs-integ-enable-execute-command/ASG/DrainECSHook/Function/AllowInvoke:awsecsintegenableexecutecommandASGLifecycleHookDrainHookTopic82F94397","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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}},"Topic":{"id":"Topic","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-enable-execute-command/ASG/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-ecs-integ-enable-execute-command/ASG/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":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}],"Version":"2012-10-17"},"policyName":"ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57","roles":[{"Ref":"ASGLifecycleHookDrainHookRoleD640316C"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/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":"ASG46ED3070"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"},"roleArn":{"Fn::GetAtt":["ASGLifecycleHookDrainHookRoleD640316C","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-ecs-integ-enable-execute-command/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-ecs-integ-enable-execute-command/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":[]}},"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"aws-ecs-integ-enable-execute-command/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.AsgCapacityProvider","version":"0.0.0"},"children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"aws-ecs-integ-enable-execute-command/EC2CapacityProvider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCapacityProvider","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::CapacityProvider","aws:cdk:cloudformation:props":{"autoScalingGroupProvider":{"autoScalingGroupArn":{"Ref":"ASG46ED3070"},"managedScaling":{"status":"ENABLED","targetCapacity":100},"managedTerminationProtection":"DISABLED"},"name":"cp-aws-ecs-integ-enable-execute-commandEC2CapacityProvider4341E2A3"}}}}},"EC2CPCluster":{"id":"EC2CPCluster","path":"aws-ecs-integ-enable-execute-command/EC2CPCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*","executeCommandConfiguration":{"logConfiguration":{"s3Bucket":"*","s3EncryptionEnabled":true,"s3KeyPrefix":"*"},"logging":"OVERRIDE"}},{"addAsgCapacityProvider":["*"]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/EC2CPCluster/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":{"configuration":{"executeCommandConfiguration":{"logConfiguration":{"s3BucketName":{"Ref":"EcsExecBucket4F468651"},"s3EncryptionEnabled":true,"s3KeyPrefix":"exec-output"},"logging":"OVERRIDE"}}}}},"EC2CPCluster":{"id":"EC2CPCluster","path":"aws-ecs-integ-enable-execute-command/EC2CPCluster/EC2CPCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"Ref":"EC2CapacityProvider5A2E35CD"}],"cluster":{"Ref":"EC2CPClusterD5F0FD32"},"defaultCapacityProviderStrategy":[]}}}}},"EC2Service":{"id":"EC2Service","path":"aws-ecs-integ-enable-execute-command/EC2Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ-enable-execute-command/EC2Service/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":"EC2CPClusterD5F0FD32"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"enableExecuteCommand":true,"launchType":"EC2","schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-enable-execute-command/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-enable-execute-command/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"enable-execute-command-test":{"id":"enable-execute-command-test","path":"enable-execute-command-test","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"enable-execute-command-test/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"enable-execute-command-test/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"enable-execute-command-test/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"enable-execute-command-test/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"enable-execute-command-test/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.environment-file.js.snapshot/aws-ecs-integ.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/aws-ecs-integ.assets.json
index 1fec22830ffd4..78f131a602c48 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/aws-ecs-integ.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/aws-ecs-integ.assets.json
@@ -71,16 +71,16 @@
}
}
},
- "aa7fadc6012636c063eeb2c939fb36f5c6aaf1251e59cca59d484ae7e112b8fc": {
+ "0871c846a7f4ba1e6379a5ea95aeccb88f8006f8cb95e3a62c31563765085f23": {
"displayName": "aws-ecs-integ Template",
"source": {
"path": "aws-ecs-integ.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region-84dc06b1": {
+ "current_account-current_region-3e5e56e9": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "aa7fadc6012636c063eeb2c939fb36f5c6aaf1251e59cca59d484ae7e112b8fc.json",
+ "objectKey": "0871c846a7f4ba1e6379a5ea95aeccb88f8006f8cb95e3a62c31563765085f23.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/aws-ecs-integ.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/aws-ecs-integ.template.json
index 36c5413b3a049..3dd1add2a42e9 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/aws-ecs-integ.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/aws-ecs-integ.template.json
@@ -907,7 +907,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -923,7 +923,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/integ.json
index d74eba9fb0c92..ed0ef4b7b8f88 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/integ.json
@@ -10,5 +10,5 @@
"assertionStackName": "IntegDefaultTestDeployAssert4E6713E1"
}
},
- "minimumCliVersion": "2.1024.0"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/manifest.json
index 39d2de80b9ea9..d41cddade8e17 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/manifest.json
@@ -18,7 +18,7 @@
"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}/aa7fadc6012636c063eeb2c939fb36f5c6aaf1251e59cca59d484ae7e112b8fc.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/0871c846a7f4ba1e6379a5ea95aeccb88f8006f8cb95e3a62c31563765085f23.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1832,5 +1832,5 @@
}
}
},
- "minimumCliVersion": "2.1024.0"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/tree.json
index 73dddbc1b6646..2dab452aa60f8 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.environment-file.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-ecs-integ":{"id":"aws-ecs-integ","path":"aws-ecs-integ","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Bucket":{"id":"Bucket","path":"aws-ecs-integ/Bucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.Bucket","version":"0.0.0","metadata":[{"blockPublicAccess":"*","removalPolicy":"destroy","autoDeleteObjects":true}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/Bucket/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucket","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{"publicAccessBlockConfiguration":{"blockPublicAcls":true,"blockPublicPolicy":true,"ignorePublicAcls":true,"restrictPublicBuckets":true},"tags":[{"key":"aws-cdk:auto-delete-objects","value":"true"},{"key":"aws-cdk:cr-owned:f8f0a91c","value":"true"}]}}},"Policy":{"id":"Policy","path":"aws-ecs-integ/Bucket/Policy","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketPolicy","version":"0.0.0","metadata":[{"bucket":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/Bucket/Policy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucketPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::BucketPolicy","aws:cdk:cloudformation:props":{"bucket":{"Ref":"Bucket83908E77"},"policyDocument":{"Statement":[{"Action":["s3:DeleteObject*","s3:GetBucket*","s3:List*","s3:PutBucketPolicy"],"Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]}},"Resource":[{"Fn::GetAtt":["Bucket83908E77","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["Bucket83908E77","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}}}}}},"AutoDeleteObjectsCustomResource":{"id":"AutoDeleteObjectsCustomResource","path":"aws-ecs-integ/Bucket/AutoDeleteObjectsCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"aws-ecs-integ/Bucket/AutoDeleteObjectsCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::S3AutoDeleteObjectsCustomResourceProvider":{"id":"Custom::S3AutoDeleteObjectsCustomResourceProvider","path":"aws-ecs-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-ecs-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"aws-ecs-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"aws-ecs-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Vpc":{"id":"Vpc","path":"aws-ecs-integ/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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('Got event without EC2InstanceId: %s', 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.9","tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A":{"id":"AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A","path":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A","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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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":[]}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-ecs-integ/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"inlinePolicies":"*"}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-integ/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/ExecutionRole/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"},"policies":[{"policyName":"s3Policy","policyDocument":{"Statement":[{"Action":["s3:GetBucketLocation","s3:GetObject"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"}}]}}}}},"TaskDefinition":{"id":"TaskDefinition","path":"aws-ecs-integ/TaskDefinition","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ/TaskDefinition/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ/TaskDefinition/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/TaskDefinition/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-ecs-integ/TaskDefinition/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":"Container","environmentFiles":[{"type":"s3","value":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"/872561bf078edd1685d50c9ff821cdd60d2b2ddfb0013c4087e79bf2bb50724d.env"]]}},{"type":"s3","value":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Ref":"Bucket83908E77"},"/test-envfile.env"]]}}]}],"executionRoleArn":{"Fn::GetAtt":["ExecutionRole605A040B","Arn"]},"family":"awsecsintegTaskDefinition11DF163D","networkMode":"awsvpc","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefinitionTaskRoleFD40A61D","Arn"]}}}}}},"EnvFileDeployment":{"id":"EnvFileDeployment","path":"aws-ecs-integ/EnvFileDeployment","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_deployment.BucketDeployment","version":"0.0.0"},"children":{"AwsCliLayer":{"id":"AwsCliLayer","path":"aws-ecs-integ/EnvFileDeployment/AwsCliLayer","constructInfo":{"fqn":"aws-cdk-lib.lambda_layer_awscli.AwsCliLayer","version":"0.0.0","metadata":[{}]},"children":{"Code":{"id":"Code","path":"aws-ecs-integ/EnvFileDeployment/AwsCliLayer/Code","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"0.0.0"},"children":{"Stage":{"id":"Stage","path":"aws-ecs-integ/EnvFileDeployment/AwsCliLayer/Code/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"AssetBucket":{"id":"AssetBucket","path":"aws-ecs-integ/EnvFileDeployment/AwsCliLayer/Code/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"0.0.0","metadata":[]}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ/EnvFileDeployment/AwsCliLayer/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnLayerVersion","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::LayerVersion","aws:cdk:cloudformation:props":{"content":{"s3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"s3Key":"c49d356cac773d491c5f7ac148995a1181498a8e289429f8612a7f7e3814f535.zip"},"description":"/opt/awscli/aws"}}}}},"CustomResourceHandler":{"id":"CustomResourceHandler","path":"aws-ecs-integ/EnvFileDeployment/CustomResourceHandler","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.SingletonFunction","version":"0.0.0","metadata":[{"uuid":"*","layers":["*"],"environment":"*","lambdaPurpose":"*","timeout":"*","role":"*","memorySize":"*","ephemeralStorageSize":"*","vpc":"*","vpcSubnets":"*","filesystem":"*","logGroup":"*","code":"*","handler":"*","runtime":"*"},{"addMetadata":["*",true]},{"addMetadata":["*","*"]}]}},"Asset1":{"id":"Asset1","path":"aws-ecs-integ/EnvFileDeployment/Asset1","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"0.0.0"},"children":{"Stage":{"id":"Stage","path":"aws-ecs-integ/EnvFileDeployment/Asset1/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"AssetBucket":{"id":"AssetBucket","path":"aws-ecs-integ/EnvFileDeployment/Asset1/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"0.0.0","metadata":[]}}}},"CustomResource":{"id":"CustomResource","path":"aws-ecs-integ/EnvFileDeployment/CustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"aws-ecs-integ/EnvFileDeployment/CustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C":{"id":"Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"0.0.0","metadata":[{"layers":["*"],"environment":"*","timeout":"*","role":"*","memorySize":"*","ephemeralStorageSize":"*","vpc":"*","vpcSubnets":"*","filesystem":"*","logGroup":"*","code":"*","handler":"*","runtime":"*"},{"addEnvironment":["*","*"]},{"addLayers":["*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/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"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/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":["s3:GetBucket*","s3:GetObject*","s3:List*"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"}]]}]},{"Action":["s3:Abort*","s3:DeleteObject*","s3:GetBucket*","s3:GetObject*","s3:List*","s3:PutObject","s3:PutObjectLegalHold","s3:PutObjectRetention","s3:PutObjectTagging","s3:PutObjectVersionTagging"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["Bucket83908E77","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["Bucket83908E77","Arn"]},"/*"]]}]}],"Version":"2012-10-17"},"policyName":"CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRoleDefaultPolicy88902FDF","roles":[{"Ref":"CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265"}]}}}}}}},"Code":{"id":"Code","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Code","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"0.0.0"},"children":{"Stage":{"id":"Stage","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Code/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"AssetBucket":{"id":"AssetBucket","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Code/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"0.0.0","metadata":[]}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/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":{"s3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"s3Key":"3423a042b818e31c1e34a19d6689ab2e5f9b70fcbe9e71df66f241b20a200bd9.zip"},"environment":{"variables":{"AWS_CA_BUNDLE":"/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem"}},"handler":"index.handler","layers":[{"Ref":"EnvFileDeploymentAwsCliLayerA8FC897D"}],"role":{"Fn::GetAtt":["CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265","Arn"]},"runtime":"python3.11","timeout":900}}}}},"Container":{"id":"Container","path":"aws-ecs-integ/Container","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"EnvironmentFile":{"id":"EnvironmentFile","path":"aws-ecs-integ/Container/EnvironmentFile","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"0.0.0"},"children":{"Stage":{"id":"Stage","path":"aws-ecs-integ/Container/EnvironmentFile/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"AssetBucket":{"id":"AssetBucket","path":"aws-ecs-integ/Container/EnvironmentFile/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"0.0.0","metadata":[]}}}}}},"Service":{"id":"Service","path":"aws-ecs-integ/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ/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","networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"DISABLED","subnets":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}],"securityGroups":[{"Fn::GetAtt":["ServiceSecurityGroupC96ED6A7","GroupId"]}]}},"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDefinitionB36D86D9"}}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-integ/Service/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/Service/SecurityGroup/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-ecs-integ/Service/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"Integ":{"id":"Integ","path":"Integ","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"Integ/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"Integ/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"Integ/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"Integ/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"Integ/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
+{"version":"tree-0.1","tree":{"id":"App","path":"","constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.0.0"},"children":{"aws-ecs-integ":{"id":"aws-ecs-integ","path":"aws-ecs-integ","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Bucket":{"id":"Bucket","path":"aws-ecs-integ/Bucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.Bucket","version":"0.0.0","metadata":[{"blockPublicAccess":"*","removalPolicy":"destroy","autoDeleteObjects":true}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/Bucket/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucket","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{"publicAccessBlockConfiguration":{"blockPublicAcls":true,"blockPublicPolicy":true,"ignorePublicAcls":true,"restrictPublicBuckets":true},"tags":[{"key":"aws-cdk:auto-delete-objects","value":"true"},{"key":"aws-cdk:cr-owned:f8f0a91c","value":"true"}]}}},"Policy":{"id":"Policy","path":"aws-ecs-integ/Bucket/Policy","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketPolicy","version":"0.0.0","metadata":[{"bucket":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/Bucket/Policy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucketPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::BucketPolicy","aws:cdk:cloudformation:props":{"bucket":{"Ref":"Bucket83908E77"},"policyDocument":{"Statement":[{"Action":["s3:DeleteObject*","s3:GetBucket*","s3:List*","s3:PutBucketPolicy"],"Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]}},"Resource":[{"Fn::GetAtt":["Bucket83908E77","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["Bucket83908E77","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}}}}}},"AutoDeleteObjectsCustomResource":{"id":"AutoDeleteObjectsCustomResource","path":"aws-ecs-integ/Bucket/AutoDeleteObjectsCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"aws-ecs-integ/Bucket/AutoDeleteObjectsCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::S3AutoDeleteObjectsCustomResourceProvider":{"id":"Custom::S3AutoDeleteObjectsCustomResourceProvider","path":"aws-ecs-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-ecs-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"aws-ecs-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"aws-ecs-integ/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Vpc":{"id":"Vpc","path":"aws-ecs-integ/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A":{"id":"AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A","path":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A","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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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":[]}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-ecs-integ/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"inlinePolicies":"*"}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-integ/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/ExecutionRole/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"},"policies":[{"policyName":"s3Policy","policyDocument":{"Statement":[{"Action":["s3:GetBucketLocation","s3:GetObject"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"}}]}}}}},"TaskDefinition":{"id":"TaskDefinition","path":"aws-ecs-integ/TaskDefinition","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ/TaskDefinition/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ/TaskDefinition/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/TaskDefinition/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-ecs-integ/TaskDefinition/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":"Container","environmentFiles":[{"type":"s3","value":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"/872561bf078edd1685d50c9ff821cdd60d2b2ddfb0013c4087e79bf2bb50724d.env"]]}},{"type":"s3","value":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Ref":"Bucket83908E77"},"/test-envfile.env"]]}}]}],"executionRoleArn":{"Fn::GetAtt":["ExecutionRole605A040B","Arn"]},"family":"awsecsintegTaskDefinition11DF163D","networkMode":"awsvpc","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefinitionTaskRoleFD40A61D","Arn"]}}}}}},"EnvFileDeployment":{"id":"EnvFileDeployment","path":"aws-ecs-integ/EnvFileDeployment","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_deployment.BucketDeployment","version":"0.0.0"},"children":{"AwsCliLayer":{"id":"AwsCliLayer","path":"aws-ecs-integ/EnvFileDeployment/AwsCliLayer","constructInfo":{"fqn":"aws-cdk-lib.lambda_layer_awscli.AwsCliLayer","version":"0.0.0","metadata":[{}]},"children":{"Code":{"id":"Code","path":"aws-ecs-integ/EnvFileDeployment/AwsCliLayer/Code","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"0.0.0"},"children":{"Stage":{"id":"Stage","path":"aws-ecs-integ/EnvFileDeployment/AwsCliLayer/Code/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"AssetBucket":{"id":"AssetBucket","path":"aws-ecs-integ/EnvFileDeployment/AwsCliLayer/Code/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"0.0.0","metadata":[]}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ/EnvFileDeployment/AwsCliLayer/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnLayerVersion","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::LayerVersion","aws:cdk:cloudformation:props":{"content":{"s3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"s3Key":"c49d356cac773d491c5f7ac148995a1181498a8e289429f8612a7f7e3814f535.zip"},"description":"/opt/awscli/aws"}}}}},"CustomResourceHandler":{"id":"CustomResourceHandler","path":"aws-ecs-integ/EnvFileDeployment/CustomResourceHandler","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.SingletonFunction","version":"0.0.0","metadata":[{"uuid":"*","layers":["*"],"environment":"*","lambdaPurpose":"*","timeout":"*","role":"*","memorySize":"*","ephemeralStorageSize":"*","vpc":"*","vpcSubnets":"*","filesystem":"*","logGroup":"*","code":"*","handler":"*","runtime":"*"},{"addMetadata":["*",true]},{"addMetadata":["*","*"]}]}},"Asset1":{"id":"Asset1","path":"aws-ecs-integ/EnvFileDeployment/Asset1","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"0.0.0"},"children":{"Stage":{"id":"Stage","path":"aws-ecs-integ/EnvFileDeployment/Asset1/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"AssetBucket":{"id":"AssetBucket","path":"aws-ecs-integ/EnvFileDeployment/Asset1/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"0.0.0","metadata":[]}}}},"CustomResource":{"id":"CustomResource","path":"aws-ecs-integ/EnvFileDeployment/CustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"aws-ecs-integ/EnvFileDeployment/CustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C":{"id":"Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C","constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"0.0.0","metadata":[{"layers":["*"],"environment":"*","timeout":"*","role":"*","memorySize":"*","ephemeralStorageSize":"*","vpc":"*","vpcSubnets":"*","filesystem":"*","logGroup":"*","code":"*","handler":"*","runtime":"*"},{"addEnvironment":["*","*"]},{"addLayers":["*"]}]},"children":{"ServiceRole":{"id":"ServiceRole","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/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"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/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":["s3:GetBucket*","s3:GetObject*","s3:List*"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"}]]}]},{"Action":["s3:Abort*","s3:DeleteObject*","s3:GetBucket*","s3:GetObject*","s3:List*","s3:PutObject","s3:PutObjectLegalHold","s3:PutObjectRetention","s3:PutObjectTagging","s3:PutObjectVersionTagging"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["Bucket83908E77","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["Bucket83908E77","Arn"]},"/*"]]}]}],"Version":"2012-10-17"},"policyName":"CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRoleDefaultPolicy88902FDF","roles":[{"Ref":"CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265"}]}}}}}}},"Code":{"id":"Code","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Code","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"0.0.0"},"children":{"Stage":{"id":"Stage","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Code/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"AssetBucket":{"id":"AssetBucket","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Code/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"0.0.0","metadata":[]}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/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":{"s3Bucket":{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"s3Key":"3423a042b818e31c1e34a19d6689ab2e5f9b70fcbe9e71df66f241b20a200bd9.zip"},"environment":{"variables":{"AWS_CA_BUNDLE":"/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem"}},"handler":"index.handler","layers":[{"Ref":"EnvFileDeploymentAwsCliLayerA8FC897D"}],"role":{"Fn::GetAtt":["CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265","Arn"]},"runtime":"python3.11","timeout":900}}}}},"Container":{"id":"Container","path":"aws-ecs-integ/Container","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"EnvironmentFile":{"id":"EnvironmentFile","path":"aws-ecs-integ/Container/EnvironmentFile","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"0.0.0"},"children":{"Stage":{"id":"Stage","path":"aws-ecs-integ/Container/EnvironmentFile/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"AssetBucket":{"id":"AssetBucket","path":"aws-ecs-integ/Container/EnvironmentFile/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"0.0.0","metadata":[]}}}}}},"Service":{"id":"Service","path":"aws-ecs-integ/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ/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","networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"DISABLED","subnets":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}],"securityGroups":[{"Fn::GetAtt":["ServiceSecurityGroupC96ED6A7","GroupId"]}]}},"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDefinitionB36D86D9"}}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-integ/Service/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/Service/SecurityGroup/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-ecs-integ/Service/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"Integ":{"id":"Integ","path":"Integ","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"Integ/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"Integ/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"Integ/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"Integ/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"Integ/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.exec-command.js.snapshot/aws-ecs-integ-exec-command.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/aws-ecs-integ-exec-command.assets.json
index 68eef1ca19102..7791751973b67 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/aws-ecs-integ-exec-command.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/aws-ecs-integ-exec-command.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "9b91986d8e19cea21ab8affdab660a99f2852c849fddc68040ac403e9988efda": {
+ "971aa5b5d78d6a59d13a1ab5e210b00333008673084de7a5c97fb21b2c8f039c": {
+ "displayName": "aws-ecs-integ-exec-command Template",
"source": {
"path": "aws-ecs-integ-exec-command.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-5de23add": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "9b91986d8e19cea21ab8affdab660a99f2852c849fddc68040ac403e9988efda.json",
+ "objectKey": "971aa5b5d78d6a59d13a1ab5e210b00333008673084de7a5c97fb21b2c8f039c.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/aws-ecs-integ-exec-command.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/aws-ecs-integ-exec-command.template.json
index c6eb78da6bb52..dee36d522ede7 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/aws-ecs-integ-exec-command.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/aws-ecs-integ-exec-command.template.json
@@ -899,7 +899,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -915,7 +915,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/integ.json
index cac960ba641aa..45b45bbad3884 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"testCases": {
"integ.exec-command": {
"stacks": [
@@ -10,5 +10,6 @@
}
},
"synthContext": {},
- "enableLookups": false
+ "enableLookups": false,
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/manifest.json
index 68034393e2403..ddc29a2f978ab 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ-exec-command.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/9b91986d8e19cea21ab8affdab660a99f2852c849fddc68040ac403e9988efda.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/971aa5b5d78d6a59d13a1ab5e210b00333008673084de7a5c97fb21b2c8f039c.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1217,51 +1217,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole0C4190B7C": [
- {
- "type": "aws:cdk:logicalId",
- "data": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole0C4190B7C",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole18817D25E": [
- {
- "type": "aws:cdk:logicalId",
- "data": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole18817D25E",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole274ABEFAA": [
- {
- "type": "aws:cdk:logicalId",
- "data": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole274ABEFAA",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole35049FE26": [
- {
- "type": "aws:cdk:logicalId",
- "data": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole35049FE26",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole46BD5E1C5": [
- {
- "type": "aws:cdk:logicalId",
- "data": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole46BD5E1C5",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ-exec-command"
@@ -1271,6 +1226,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/tree.json
index e5d06e1575a77..4980d273092bb 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.exec-command.js.snapshot/tree.json
@@ -1,2518 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ-exec-command": {
- "id": "aws-ecs-integ-exec-command",
- "path": "aws-ecs-integ-exec-command",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ-exec-command/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/Vpc/Resource",
- "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-ecs-integ-exec-command/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ-exec-command/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-exec-command/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-exec-command/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-exec-command/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ-exec-command/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-exec-command/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-exec-command/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-exec-command/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-exec-command/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ-exec-command/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-exec-command/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ-exec-command/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-exec-command/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-exec-command/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-exec-command/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-exec-command/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-exec-command/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ-exec-command/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-exec-command/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ-exec-command/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-exec-command/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-exec-command/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-exec-command/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-exec-command/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-exec-command/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ-exec-command/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-exec-command/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ-exec-command/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "KmsKey": {
- "id": "KmsKey",
- "path": "aws-ecs-integ-exec-command/KmsKey",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/KmsKey/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::KMS::Key",
- "aws:cdk:cloudformation:props": {
- "keyPolicy": {
- "Statement": [
- {
- "Action": "kms:*",
- "Effect": "Allow",
- "Principal": {
- "AWS": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":iam::",
- {
- "Ref": "AWS::AccountId"
- },
- ":root"
- ]
- ]
- }
- },
- "Resource": "*"
- },
- {
- "Action": [
- "kms:Decrypt*",
- "kms:Describe*",
- "kms:Encrypt*",
- "kms:GenerateDataKey*",
- "kms:ReEncrypt*"
- ],
- "Condition": {
- "ArnLike": {
- "kms:EncryptionContext:aws:logs:arn": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":logs:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":*"
- ]
- ]
- }
- }
- },
- "Effect": "Allow",
- "Principal": {
- "Service": {
- "Fn::Join": [
- "",
- [
- "logs.",
- {
- "Ref": "AWS::Region"
- },
- ".amazonaws.com"
- ]
- ]
- }
- },
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_kms.CfnKey",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_kms.Key",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-ecs-integ-exec-command/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {
- "kmsKeyId": {
- "Fn::GetAtt": [
- "KmsKey46693ADD",
- "Arn"
- ]
- },
- "retentionInDays": 731
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "encryptionKey": "*"
- }
- ]
- }
- },
- "EcsExecBucket": {
- "id": "EcsExecBucket",
- "path": "aws-ecs-integ-exec-command/EcsExecBucket",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/EcsExecBucket/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::S3::Bucket",
- "aws:cdk:cloudformation:props": {
- "bucketEncryption": {
- "serverSideEncryptionConfiguration": [
- {
- "serverSideEncryptionByDefault": {
- "sseAlgorithm": "aws:kms",
- "kmsMasterKeyId": {
- "Fn::GetAtt": [
- "KmsKey46693ADD",
- "Arn"
- ]
- }
- }
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_s3.CfnBucket",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_s3.Bucket",
- "version": "0.0.0",
- "metadata": [
- {
- "encryptionKey": "*"
- }
- ]
- }
- },
- "Ec2Cluster": {
- "id": "Ec2Cluster",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {
- "configuration": {
- "executeCommandConfiguration": {
- "kmsKeyId": {
- "Fn::GetAtt": [
- "KmsKey46693ADD",
- "Arn"
- ]
- },
- "logConfiguration": {
- "cloudWatchEncryptionEnabled": true,
- "cloudWatchLogGroupName": {
- "Ref": "LogGroupF5B46931"
- },
- "s3BucketName": {
- "Ref": "EcsExecBucket4F468651"
- },
- "s3EncryptionEnabled": true,
- "s3KeyPrefix": "exec-output"
- },
- "logging": "OVERRIDE"
- }
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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": [
- "Ec2ClusterEE43E89D",
- "Arn"
- ]
- }
- },
- {
- "Action": [
- "ecs:Poll",
- "ecs:StartTelemetrySession"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "Ec2ClusterEE43E89D",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecr:GetAuthorizationToken",
- "ecs:DiscoverPollEndpoint",
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "Ec2ClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy6D2DC2FD",
- "roles": [
- {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupInstanceRole73D80898"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupInstanceRole73D80898"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupInstanceProfileDB232471",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "t2.micro",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupInstanceSecurityGroup149B0A9E",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "#!/bin/bash\necho ECS_CLUSTER=",
- {
- "Ref": "Ec2ClusterEE43E89D"
- },
- " >> /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-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLaunchTemplate346F58BE"
- },
- "version": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupLaunchTemplate346F58BE",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "1",
- "minSize": "1",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "Ec2ClusterDefaultAutoScalingGroupASGC5A6D4C0"
- }
- ]
- ]
- }
- },
- {
- "Action": [
- "ecs:DescribeContainerInstances",
- "ecs:DescribeTasks",
- "ecs:ListTasks",
- "ecs:UpdateContainerInstancesState"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "Ec2ClusterEE43E89D",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecs:ListContainerInstances",
- "ecs:SubmitContainerStateChange",
- "ecs:SubmitTaskStateChange"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "Ec2ClusterEE43E89D",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicy638C9E33",
- "roles": [
- {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole23116FA3"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": "Ec2ClusterEE43E89D"
- }
- }
- },
- "handler": "index.lambda_handler",
- "role": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole23116FA3",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegexeccommandEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic05F8C929": {
- "id": "AllowInvoke:awsecsintegexeccommandEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic05F8C929",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegexeccommandEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic05F8C929",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionE0DEFB31",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionE0DEFB31",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicyE499974B",
- "roles": [
- {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole71045ED7"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupASGC5A6D4C0"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole71045ED7",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "executeCommandConfiguration": {
- "kmsKey": "*",
- "logConfiguration": {
- "cloudWatchLogGroup": "*",
- "cloudWatchEncryptionEnabled": true,
- "s3Bucket": "*",
- "s3EncryptionEnabled": true,
- "s3KeyPrefix": "*"
- },
- "logging": "OVERRIDE"
- }
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ-exec-command/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-ecs-integ-exec-command/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-ecs-integ-exec-command/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ-exec-command/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ-exec-command/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-exec-command/TaskDef/TaskRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/TaskDef/TaskRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "logs:DescribeLogGroups",
- "s3:GetBucketLocation",
- "ssmmessages:CreateControlChannel",
- "ssmmessages:CreateDataChannel",
- "ssmmessages:OpenControlChannel",
- "ssmmessages:OpenDataChannel"
- ],
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "kms:Decrypt",
- "kms:GenerateDataKey"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "KmsKey46693ADD",
- "Arn"
- ]
- }
- },
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:DescribeLogStreams",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":logs:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":log-group:",
- {
- "Ref": "LogGroupF5B46931"
- },
- ":*"
- ]
- ]
- }
- },
- {
- "Action": "s3:PutObject",
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":s3:::",
- {
- "Ref": "EcsExecBucket4F468651"
- },
- "/*"
- ]
- ]
- }
- },
- {
- "Action": "s3:GetEncryptionConfiguration",
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":s3:::",
- {
- "Ref": "EcsExecBucket4F468651"
- }
- ]
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "TaskDefTaskRoleDefaultPolicyA592CB18",
- "roles": [
- {
- "Ref": "TaskDefTaskRole1EDB4A67"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-exec-command/TaskDef/Resource",
- "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": "awsecsintegexeccommandTaskDef44709274",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "web": {
- "id": "web",
- "path": "aws-ecs-integ-exec-command/TaskDef/web",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*"
- ]
- }
- },
- "Ec2Service": {
- "id": "Ec2Service",
- "path": "aws-ecs-integ-exec-command/Ec2Service",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-exec-command/Ec2Service/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "Ec2ClusterEE43E89D"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "enableExecuteCommand": true,
- "launchType": "EC2",
- "schedulingStrategy": "REPLICA",
- "taskDefinition": {
- "Ref": "TaskDef54694570"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-exec-command/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-exec-command/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ-exec-command":{"id":"aws-ecs-integ-exec-command","path":"aws-ecs-integ-exec-command","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-exec-command/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-exec-command/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-ecs-integ-exec-command/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-exec-command/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-ecs-integ-exec-command/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-ecs-integ-exec-command/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-exec-command/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-exec-command/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-ecs-integ-exec-command/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-exec-command/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-exec-command/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-exec-command/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-ecs-integ-exec-command/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-exec-command/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-exec-command/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ-exec-command/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-ecs-integ-exec-command/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-ecs-integ-exec-command/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-exec-command/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-exec-command/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-ecs-integ-exec-command/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-exec-command/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-exec-command/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-exec-command/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-ecs-integ-exec-command/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-exec-command/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ-exec-command/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-exec-command/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-ecs-integ-exec-command/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-ecs-integ-exec-command/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-exec-command/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-exec-command/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-ecs-integ-exec-command/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-exec-command/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-exec-command/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ-exec-command/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-ecs-integ-exec-command/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-ecs-integ-exec-command/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-exec-command/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-exec-command/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-ecs-integ-exec-command/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-exec-command/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-exec-command/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-exec-command/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-ecs-integ-exec-command/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-exec-command/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"KmsKey":{"id":"KmsKey","path":"aws-ecs-integ-exec-command/KmsKey","constructInfo":{"fqn":"aws-cdk-lib.aws_kms.Key","version":"0.0.0","metadata":["*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-exec-command/KmsKey/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_kms.CfnKey","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::KMS::Key","aws:cdk:cloudformation:props":{"keyPolicy":{"Statement":[{"Action":"kms:*","Effect":"Allow","Principal":{"AWS":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::",{"Ref":"AWS::AccountId"},":root"]]}},"Resource":"*"},{"Action":["kms:Decrypt*","kms:Describe*","kms:Encrypt*","kms:GenerateDataKey*","kms:ReEncrypt*"],"Condition":{"ArnLike":{"kms:EncryptionContext:aws:logs:arn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":*"]]}}},"Effect":"Allow","Principal":{"Service":{"Fn::Join":["",["logs.",{"Ref":"AWS::Region"},".amazonaws.com"]]}},"Resource":"*"}],"Version":"2012-10-17"}}}}}},"LogGroup":{"id":"LogGroup","path":"aws-ecs-integ-exec-command/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"encryptionKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-exec-command/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{"kmsKeyId":{"Fn::GetAtt":["KmsKey46693ADD","Arn"]},"retentionInDays":731}}}}},"EcsExecBucket":{"id":"EcsExecBucket","path":"aws-ecs-integ-exec-command/EcsExecBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.Bucket","version":"0.0.0","metadata":[{"encryptionKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-exec-command/EcsExecBucket/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucket","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{"bucketEncryption":{"serverSideEncryptionConfiguration":[{"serverSideEncryptionByDefault":{"sseAlgorithm":"aws:kms","kmsMasterKeyId":{"Fn::GetAtt":["KmsKey46693ADD","Arn"]}}}]}}}}}},"Ec2Cluster":{"id":"Ec2Cluster","path":"aws-ecs-integ-exec-command/Ec2Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*","executeCommandConfiguration":{"kmsKey":"*","logConfiguration":{"cloudWatchLogGroup":"*","cloudWatchEncryptionEnabled":true,"s3Bucket":"*","s3EncryptionEnabled":true,"s3KeyPrefix":"*"},"logging":"OVERRIDE"}},{"addCapacity":["*",{"instanceType":"*"}]},{"addAutoScalingGroup":["*",{"machineImageType":0}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-exec-command/Ec2Cluster/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":{"configuration":{"executeCommandConfiguration":{"kmsKeyId":{"Fn::GetAtt":["KmsKey46693ADD","Arn"]},"logConfiguration":{"cloudWatchEncryptionEnabled":true,"cloudWatchLogGroupName":{"Ref":"LogGroupF5B46931"},"s3BucketName":{"Ref":"EcsExecBucket4F468651"},"s3EncryptionEnabled":true,"s3KeyPrefix":"exec-output"},"logging":"OVERRIDE"}}}}},"DefaultAutoScalingGroup":{"id":"DefaultAutoScalingGroup","path":"aws-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/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":["Ec2ClusterEE43E89D","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"Ec2ClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy6D2DC2FD","roles":[{"Ref":"Ec2ClusterDefaultAutoScalingGroupInstanceRole73D80898"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-ecs-integ-exec-command/Ec2Cluster/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":"Ec2ClusterDefaultAutoScalingGroupInstanceRole73D80898"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/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":["Ec2ClusterDefaultAutoScalingGroupInstanceProfileDB232471","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["Ec2ClusterDefaultAutoScalingGroupInstanceSecurityGroup149B0A9E","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"Ec2ClusterEE43E89D"}," >> /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-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-exec-command/Ec2Cluster/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":"Ec2ClusterDefaultAutoScalingGroupLaunchTemplate346F58BE"},"version":{"Fn::GetAtt":["Ec2ClusterDefaultAutoScalingGroupLaunchTemplate346F58BE","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/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":"Ec2ClusterDefaultAutoScalingGroupASGC5A6D4C0"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]}}],"Version":"2012-10-17"},"policyName":"Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicy638C9E33","roles":[{"Ref":"Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole23116FA3"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-exec-command/Ec2Cluster/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":"Ec2ClusterEE43E89D"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole23116FA3","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegexeccommandEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic05F8C929":{"id":"AllowInvoke:awsecsintegexeccommandEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic05F8C929","path":"aws-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegexeccommandEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic05F8C929","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":["Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionE0DEFB31","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"}}}},"Topic":{"id":"Topic","path":"aws-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/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":["Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionE0DEFB31","Arn"]},"protocol":"lambda","topicArn":{"Ref":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-exec-command/Ec2Cluster/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-ecs-integ-exec-command/Ec2Cluster/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":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"}}],"Version":"2012-10-17"},"policyName":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicyE499974B","roles":[{"Ref":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole71045ED7"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-exec-command/Ec2Cluster/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":"Ec2ClusterDefaultAutoScalingGroupASGC5A6D4C0"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"},"roleArn":{"Fn::GetAtt":["Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole71045ED7","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-ecs-integ-exec-command/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-ecs-integ-exec-command/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-ecs-integ-exec-command/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*","*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-exec-command/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-exec-command/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-exec-command/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-exec-command/TaskDef/TaskRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-exec-command/TaskDef/TaskRole/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":["logs:DescribeLogGroups","s3:GetBucketLocation","ssmmessages:CreateControlChannel","ssmmessages:CreateDataChannel","ssmmessages:OpenControlChannel","ssmmessages:OpenDataChannel"],"Effect":"Allow","Resource":"*"},{"Action":["kms:Decrypt","kms:GenerateDataKey"],"Effect":"Allow","Resource":{"Fn::GetAtt":["KmsKey46693ADD","Arn"]}},{"Action":["logs:CreateLogStream","logs:DescribeLogStreams","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:",{"Ref":"LogGroupF5B46931"},":*"]]}},{"Action":"s3:PutObject","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Ref":"EcsExecBucket4F468651"},"/*"]]}},{"Action":"s3:GetEncryptionConfiguration","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Ref":"EcsExecBucket4F468651"}]]}}],"Version":"2012-10-17"},"policyName":"TaskDefTaskRoleDefaultPolicyA592CB18","roles":[{"Ref":"TaskDefTaskRole1EDB4A67"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-exec-command/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":"awsecsintegexeccommandTaskDef44709274","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"aws-ecs-integ-exec-command/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"Ec2Service":{"id":"Ec2Service","path":"aws-ecs-integ-exec-command/Ec2Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ-exec-command/Ec2Service/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":"Ec2ClusterEE43E89D"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"enableExecuteCommand":true,"launchType":"EC2","schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-exec-command/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-exec-command/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.firelens-s3-config.js.snapshot/aws-ecs-integ.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/aws-ecs-integ.assets.json
index f7c52320853b2..dd74c44d4ff86 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/aws-ecs-integ.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/aws-ecs-integ.assets.json
@@ -1,28 +1,30 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"2ca891b3a73a4a36630bba20580e3390a104d2ac9ff1f22a6bcadf575f8a5a61": {
+ "displayName": "SampleAsset",
"source": {
"path": "asset.2ca891b3a73a4a36630bba20580e3390a104d2ac9ff1f22a6bcadf575f8a5a61.conf",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-9e4ee192": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
"objectKey": "2ca891b3a73a4a36630bba20580e3390a104d2ac9ff1f22a6bcadf575f8a5a61.conf",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
},
- "999438a40b3ac417228be97a1ed509cecceca7e7df655fe86bdee11767703e5c": {
+ "d836c8fffbe19bfaf68b20f1a84c72c9e73115e48033285c34ff7f8f287262c1": {
+ "displayName": "aws-ecs-integ Template",
"source": {
"path": "aws-ecs-integ.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-d4dcc983": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "999438a40b3ac417228be97a1ed509cecceca7e7df655fe86bdee11767703e5c.json",
+ "objectKey": "d836c8fffbe19bfaf68b20f1a84c72c9e73115e48033285c34ff7f8f287262c1.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/aws-ecs-integ.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/aws-ecs-integ.template.json
index 066d3d7e02580..3d39383b103e7 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/aws-ecs-integ.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/aws-ecs-integ.template.json
@@ -755,7 +755,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/integ.json
index db8b0b7e8f897..2f917c0b47177 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"testCases": {
"integ.firelens-s3-config": {
"stacks": [
@@ -10,5 +10,6 @@
}
},
"synthContext": {},
- "enableLookups": false
+ "enableLookups": false,
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/manifest.json
index 8aa74973b63a5..8babd80dba282 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/999438a40b3ac417228be97a1ed509cecceca7e7df655fe86bdee11767703e5c.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/d836c8fffbe19bfaf68b20f1a84c72c9e73115e48033285c34ff7f8f287262c1.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1193,51 +1193,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ"
@@ -1247,6 +1202,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/tree.json
index 355b1e383f004..8593221ed65d3 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.firelens-s3-config.js.snapshot/tree.json
@@ -1,2531 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ": {
- "id": "aws-ecs-integ",
- "path": "aws-ecs-integ",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/Vpc/Resource",
- "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-ecs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/ASG",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A": {
- "id": "AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "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"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ/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-ecs-integ/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-ecs-integ/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": {
- "Ref": "SsmParameterValueawsserviceawsforfluentbit210C96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "memoryReservation": 50,
- "name": "log_router",
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": {
- "Ref": "TaskDeflogrouterLogGroup2684E4A8"
- },
- "awslogs-stream-prefix": "firelens",
- "awslogs-region": {
- "Ref": "AWS::Region"
- },
- "mode": "non-blocking",
- "max-buffer-size": "26214400b"
- }
- },
- "firelensConfiguration": {
- "type": "fluentbit",
- "options": {
- "enable-ecs-log-metadata": "false",
- "config-file-type": "s3",
- "config-file-value": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":s3:::",
- {
- "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"
- },
- "/2ca891b3a73a4a36630bba20580e3390a104d2ac9ff1f22a6bcadf575f8a5a61.conf"
- ]
- ]
- }
- }
- }
- },
- {
- "essential": true,
- "image": "nginx",
- "memory": 256,
- "name": "nginx",
- "portMappings": [
- {
- "containerPort": 80,
- "protocol": "tcp"
- }
- ],
- "logConfiguration": {
- "logDriver": "awsfirelens",
- "options": {
- "Name": "cloudwatch",
- "region": {
- "Ref": "AWS::Region"
- },
- "log_group_name": "ecs-integ-test",
- "auto_create_group": "true",
- "log_stream_prefix": "nginx"
- }
- },
- "environment": [
- {
- "name": "AWS_REGION",
- "value": {
- "Ref": "AWS::Region"
- }
- }
- ]
- }
- ],
- "executionRoleArn": {
- "Fn::GetAtt": [
- "TaskDefExecutionRoleB4775C97",
- "Arn"
- ]
- },
- "family": "awsecsintegTaskDef6FDFB69A",
- "networkMode": "awsvpc",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-ecs-integ/TaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-ecs-integ/TaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/TaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/TaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/TaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "ecr:BatchCheckLayerAvailability",
- "ecr:BatchGetImage",
- "ecr:GetAuthorizationToken",
- "ecr:GetDownloadUrlForLayer"
- ],
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "TaskDeflogrouterLogGroup2684E4A8",
- "Arn"
- ]
- }
- },
- {
- "Action": "s3:GetObject",
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":s3:::",
- {
- "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"
- },
- "/2ca891b3a73a4a36630bba20580e3390a104d2ac9ff1f22a6bcadf575f8a5a61.conf"
- ]
- ]
- }
- },
- {
- "Action": "s3:GetBucketLocation",
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":s3:::",
- {
- "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"
- }
- ]
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "TaskDefExecutionRoleDefaultPolicy0DBB737A",
- "roles": [
- {
- "Ref": "TaskDefExecutionRoleB4775C97"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- },
- "roleName": "*"
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "log_router": {
- "id": "log_router",
- "path": "aws-ecs-integ/TaskDef/log_router",
- "children": {
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-ecs-integ/TaskDef/log_router/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/TaskDef/log_router/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "retention": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.FirelensLogRouter",
- "version": "0.0.0"
- }
- },
- "nginx": {
- "id": "nginx",
- "path": "aws-ecs-integ/TaskDef/nginx",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*",
- "*"
- ]
- }
- },
- "SampleAsset": {
- "id": "SampleAsset",
- "path": "aws-ecs-integ/SampleAsset",
- "children": {
- "Stage": {
- "id": "Stage",
- "path": "aws-ecs-integ/SampleAsset/Stage",
- "constructInfo": {
- "fqn": "aws-cdk-lib.AssetStaging",
- "version": "0.0.0"
- }
- },
- "AssetBucket": {
- "id": "AssetBucket",
- "path": "aws-ecs-integ/SampleAsset/AssetBucket",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_s3.BucketBase",
- "version": "0.0.0",
- "metadata": []
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_s3_assets.Asset",
- "version": "0.0.0"
- }
- },
- "SsmParameterValue:--aws--service--aws-for-fluent-bit--2.1.0:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": {
- "id": "SsmParameterValue:--aws--service--aws-for-fluent-bit--2.1.0:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter",
- "path": "aws-ecs-integ/SsmParameterValue:--aws--service--aws-for-fluent-bit--2.1.0:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "SsmParameterValue:--aws--service--aws-for-fluent-bit--2.1.0:C96584B6-F00A-464E-AD19-53AFF4B05118": {
- "id": "SsmParameterValue:--aws--service--aws-for-fluent-bit--2.1.0:C96584B6-F00A-464E-AD19-53AFF4B05118",
- "path": "aws-ecs-integ/SsmParameterValue:--aws--service--aws-for-fluent-bit--2.1.0:C96584B6-F00A-464E-AD19-53AFF4B05118",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "websvc-sg": {
- "id": "websvc-sg",
- "path": "aws-ecs-integ/websvc-sg",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/websvc-sg/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ/websvc-sg",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "securityGroupIngress": [
- {
- "cidrIp": "0.0.0.0/0",
- "ipProtocol": "tcp",
- "fromPort": 80,
- "toPort": 80,
- "description": "from 0.0.0.0/0:80"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addIngressRule": [
- {
- "canInlineRule": true,
- "connections": "*",
- "uniqueId": "*"
- },
- {}
- ]
- }
- ]
- }
- },
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ/Service",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ/Service/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EcsCluster97242B84"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "launchType": "EC2",
- "networkConfiguration": {
- "awsvpcConfiguration": {
- "assignPublicIp": "DISABLED",
- "subnets": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ],
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "websvcsgA808F313",
- "GroupId"
- ]
- }
- ]
- }
- },
- "schedulingStrategy": "REPLICA",
- "taskDefinition": {
- "Ref": "TaskDef54694570"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ":{"id":"aws-ecs-integ","path":"aws-ecs-integ","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A":{"id":"AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A","path":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A","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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*","*","*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/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":{"Ref":"SsmParameterValueawsserviceawsforfluentbit210C96584B6F00A464EAD1953AFF4B05118Parameter"},"memoryReservation":50,"name":"log_router","logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"TaskDeflogrouterLogGroup2684E4A8"},"awslogs-stream-prefix":"firelens","awslogs-region":{"Ref":"AWS::Region"},"mode":"non-blocking","max-buffer-size":"26214400b"}},"firelensConfiguration":{"type":"fluentbit","options":{"enable-ecs-log-metadata":"false","config-file-type":"s3","config-file-value":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"/2ca891b3a73a4a36630bba20580e3390a104d2ac9ff1f22a6bcadf575f8a5a61.conf"]]}}}},{"essential":true,"image":"nginx","memory":256,"name":"nginx","portMappings":[{"containerPort":80,"protocol":"tcp"}],"logConfiguration":{"logDriver":"awsfirelens","options":{"Name":"cloudwatch","region":{"Ref":"AWS::Region"},"log_group_name":"ecs-integ-test","auto_create_group":"true","log_stream_prefix":"nginx"}},"environment":[{"name":"AWS_REGION","value":{"Ref":"AWS::Region"}}]}],"executionRoleArn":{"Fn::GetAtt":["TaskDefExecutionRoleB4775C97","Arn"]},"family":"awsecsintegTaskDef6FDFB69A","networkMode":"awsvpc","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-ecs-integ/TaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-integ/TaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/TaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/TaskDef/ExecutionRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/TaskDef/ExecutionRole/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":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetAuthorizationToken","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":"*"},{"Action":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["TaskDeflogrouterLogGroup2684E4A8","Arn"]}},{"Action":"s3:GetObject","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"/2ca891b3a73a4a36630bba20580e3390a104d2ac9ff1f22a6bcadf575f8a5a61.conf"]]}},{"Action":"s3:GetBucketLocation","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"}]]}}],"Version":"2012-10-17"},"policyName":"TaskDefExecutionRoleDefaultPolicy0DBB737A","roles":[{"Ref":"TaskDefExecutionRoleB4775C97"}]}}}}}}},"log_router":{"id":"log_router","path":"aws-ecs-integ/TaskDef/log_router","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.FirelensLogRouter","version":"0.0.0"},"children":{"LogGroup":{"id":"LogGroup","path":"aws-ecs-integ/TaskDef/log_router/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/TaskDef/log_router/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"nginx":{"id":"nginx","path":"aws-ecs-integ/TaskDef/nginx","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"SampleAsset":{"id":"SampleAsset","path":"aws-ecs-integ/SampleAsset","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"0.0.0"},"children":{"Stage":{"id":"Stage","path":"aws-ecs-integ/SampleAsset/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"AssetBucket":{"id":"AssetBucket","path":"aws-ecs-integ/SampleAsset/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"0.0.0","metadata":[]}}}},"SsmParameterValue:--aws--service--aws-for-fluent-bit--2.1.0:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--aws-for-fluent-bit--2.1.0:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","path":"aws-ecs-integ/SsmParameterValue:--aws--service--aws-for-fluent-bit--2.1.0:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"SsmParameterValue:--aws--service--aws-for-fluent-bit--2.1.0:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--aws-for-fluent-bit--2.1.0:C96584B6-F00A-464E-AD19-53AFF4B05118","path":"aws-ecs-integ/SsmParameterValue:--aws--service--aws-for-fluent-bit--2.1.0:C96584B6-F00A-464E-AD19-53AFF4B05118","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"websvc-sg":{"id":"websvc-sg","path":"aws-ecs-integ/websvc-sg","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"},{"addIngressRule":[{"canInlineRule":true,"connections":"*","uniqueId":"*"},{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/websvc-sg/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-ecs-integ/websvc-sg","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"securityGroupIngress":[{"cidrIp":"0.0.0.0/0","ipProtocol":"tcp","fromPort":80,"toPort":80,"description":"from 0.0.0.0/0:80"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"Service":{"id":"Service","path":"aws-ecs-integ/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ/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","networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"DISABLED","subnets":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}],"securityGroups":[{"Fn::GetAtt":["websvcsgA808F313","GroupId"]}]}},"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ/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.graviton-bottlerocket.js.snapshot/aws-ecs-integ.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/aws-ecs-integ.assets.json
index 34e6770be7899..c7de8f32ce145 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/aws-ecs-integ.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/aws-ecs-integ.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "bf6e4fe71b440349efbc3c21a974d05ea70bb04e592a1044b865109de94e0e05": {
+ "3951ee5d6945fecdba5d8dca1d5352da882afd24f4363bc8cf967f0ec51bb994": {
+ "displayName": "aws-ecs-integ Template",
"source": {
"path": "aws-ecs-integ.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-dd431993": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "bf6e4fe71b440349efbc3c21a974d05ea70bb04e592a1044b865109de94e0e05.json",
+ "objectKey": "3951ee5d6945fecdba5d8dca1d5352da882afd24f4363bc8cf967f0ec51bb994.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/aws-ecs-integ.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/aws-ecs-integ.template.json
index 2066faed5161f..e057e16f5e2a6 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/aws-ecs-integ.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/aws-ecs-integ.template.json
@@ -781,7 +781,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -797,7 +797,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/integ.json
index b28722eafdb9d..412d12ca0bf89 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"testCases": {
"integ.graviton-bottlerocket": {
"stacks": [
@@ -10,5 +10,6 @@
}
},
"synthContext": {},
- "enableLookups": false
+ "enableLookups": false,
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/manifest.json
index 56fd0c5a2a89c..4c1c1a9091be1 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/bf6e4fe71b440349efbc3c21a974d05ea70bb04e592a1044b865109de94e0e05.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/3951ee5d6945fecdba5d8dca1d5352da882afd24f4363bc8cf967f0ec51bb994.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -915,51 +915,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole00BEEF075": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole00BEEF075",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole1E7E6BDCA": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole1E7E6BDCA",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole2F61512F4": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole2F61512F4",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole395D5864D": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole395D5864D",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole4A01E14CA": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole4A01E14CA",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ"
@@ -969,6 +924,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/tree.json
index b23b8d4e79083..9d20261ce2604 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton-bottlerocket.js.snapshot/tree.json
@@ -1,1952 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ": {
- "id": "aws-ecs-integ",
- "path": "aws-ecs-integ",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/Vpc/Resource",
- "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-ecs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "graviton-cluster": {
- "id": "graviton-cluster",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/graviton-cluster"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceRole/Resource",
- "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"
- },
- "managedPolicyArns": [
- {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":iam::aws:policy/AmazonSSMManagedInstanceCore"
- ]
- ]
- },
- {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role"
- ]
- ]
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/graviton-cluster"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceRole/DefaultPolicy/Resource",
- "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": "EcsClustergravitonclusterInstanceRoleDefaultPolicyB89DB33F",
- "roles": [
- {
- "Ref": "EcsClustergravitonclusterInstanceRole0D0E0F94"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addManagedPolicy": [
- {
- "managedPolicyArn": "*"
- }
- ]
- },
- {
- "addManagedPolicy": [
- {
- "managedPolicyArn": "*"
- }
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClustergravitonclusterInstanceRole0D0E0F94"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "EcsClustergravitonclusterInstanceProfileD1BBFAAE",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsservicebottlerocketawsecs1arm64latestimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "c6g.large",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "EcsClustergravitonclusterInstanceSecurityGroup0187E9BB",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/graviton-cluster/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/graviton-cluster/LaunchTemplate"
- }
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "\n[settings.ecs]\ncluster = \"",
- {
- "Ref": "EcsCluster97242B84"
- },
- "\""
- ]
- ]
- }
- }
- },
- "tagSpecifications": [
- {
- "resourceType": "launch-template",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/graviton-cluster/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "EcsClustergravitonclusterLaunchTemplate46854EA7"
- },
- "version": {
- "Fn::GetAtt": [
- "EcsClustergravitonclusterLaunchTemplate46854EA7",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "2",
- "minSize": "2",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/graviton-cluster",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ/EcsCluster/graviton-cluster"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "EcsClustergravitonclusterASG869F3168"
- }
- ]
- ]
- }
- },
- {
- "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": "EcsClustergravitonclusterDrainECSHookFunctionServiceRoleDefaultPolicy1563DC6B",
- "roles": [
- {
- "Ref": "EcsClustergravitonclusterDrainECSHookFunctionServiceRole26D97764"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": [
- "EcsClustergravitonclusterDrainECSHookFunctionServiceRole26D97764",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/graviton-cluster"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegEcsClustergravitonclusterLifecycleHookDrainHookTopicF44E68AA": {
- "id": "AllowInvoke:awsecsintegEcsClustergravitonclusterLifecycleHookDrainHookTopicF44E68AA",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/AllowInvoke:awsecsintegEcsClustergravitonclusterLifecycleHookDrainHookTopicF44E68AA",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "EcsClustergravitonclusterDrainECSHookFunctionB606E681",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClustergravitonclusterDrainECSHookFunctionB606E681",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/graviton-cluster"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ/EcsCluster/graviton-cluster"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "EcsClustergravitonclusterLifecycleHookDrainHookRoleDefaultPolicy516A6DA7",
- "roles": [
- {
- "Ref": "EcsClustergravitonclusterLifecycleHookDrainHookRoleA16C85AD"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "EcsClustergravitonclusterASG869F3168"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "EcsClustergravitonclusterLifecycleHookDrainHookRoleA16C85AD",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "machineImage": "*",
- "updateType": "Replace",
- "minCapacity": "*",
- "instanceType": "*"
- },
- {
- "addUserData": [
- "*",
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "minCapacity": "*",
- "instanceType": "*",
- "machineImageType": 1
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 1
- }
- ]
- }
- ]
- }
- },
- "SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--arm64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": {
- "id": "SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--arm64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter",
- "path": "aws-ecs-integ/SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--arm64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--arm64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118": {
- "id": "SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--arm64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
- "path": "aws-ecs-integ/SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--arm64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ":{"id":"aws-ecs-integ","path":"aws-ecs-integ","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ/EcsCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addCapacity":["*",{"minCapacity":"*","instanceType":"*","machineImageType":1}]},{"addAutoScalingGroup":["*",{"machineImageType":1}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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":{}}},"graviton-cluster":{"id":"graviton-cluster","path":"aws-ecs-integ/EcsCluster/graviton-cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","minCapacity":"*","instanceType":"*"},{"addUserData":["*","*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-ecs-integ/EcsCluster/graviton-cluster/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/graviton-cluster"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ/EcsCluster/graviton-cluster/InstanceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addManagedPolicy":[{"managedPolicyArn":"*"}]},{"addManagedPolicy":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportInstanceRole":{"id":"ImportInstanceRole","path":"aws-ecs-integ/EcsCluster/graviton-cluster/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/AmazonSSMManagedInstanceCore"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role"]]}],"tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/graviton-cluster"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/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":"EcsClustergravitonclusterInstanceRoleDefaultPolicyB89DB33F","roles":[{"Ref":"EcsClustergravitonclusterInstanceRole0D0E0F94"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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":"EcsClustergravitonclusterInstanceRole0D0E0F94"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-ecs-integ/EcsCluster/graviton-cluster/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/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":["EcsClustergravitonclusterInstanceProfileD1BBFAAE","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsservicebottlerocketawsecs1arm64latestimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"c6g.large","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["EcsClustergravitonclusterInstanceSecurityGroup0187E9BB","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/graviton-cluster/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/graviton-cluster/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["\n[settings.ecs]\ncluster = \"",{"Ref":"EcsCluster97242B84"},"\""]]}}},"tagSpecifications":[{"resourceType":"launch-template","tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/graviton-cluster/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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":"EcsClustergravitonclusterLaunchTemplate46854EA7"},"version":{"Fn::GetAtt":["EcsClustergravitonclusterLaunchTemplate46854EA7","LatestVersionNumber"]}},"maxSize":"2","minSize":"2","tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/graviton-cluster","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/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":"EcsClustergravitonclusterASG869F3168"}]]}},{"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":"EcsClustergravitonclusterDrainECSHookFunctionServiceRoleDefaultPolicy1563DC6B","roles":[{"Ref":"EcsClustergravitonclusterDrainECSHookFunctionServiceRole26D97764"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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":["EcsClustergravitonclusterDrainECSHookFunctionServiceRole26D97764","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/graviton-cluster"}],"timeout":310}}},"AllowInvoke:awsecsintegEcsClustergravitonclusterLifecycleHookDrainHookTopicF44E68AA":{"id":"AllowInvoke:awsecsintegEcsClustergravitonclusterLifecycleHookDrainHookTopicF44E68AA","path":"aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/AllowInvoke:awsecsintegEcsClustergravitonclusterLifecycleHookDrainHookTopicF44E68AA","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":["EcsClustergravitonclusterDrainECSHookFunctionB606E681","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"}}}},"Topic":{"id":"Topic","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/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":["EcsClustergravitonclusterDrainECSHookFunctionB606E681","Arn"]},"protocol":"lambda","topicArn":{"Ref":"EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/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":"EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"}}],"Version":"2012-10-17"},"policyName":"EcsClustergravitonclusterLifecycleHookDrainHookRoleDefaultPolicy516A6DA7","roles":[{"Ref":"EcsClustergravitonclusterLifecycleHookDrainHookRoleA16C85AD"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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":"EcsClustergravitonclusterASG869F3168"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"},"roleArn":{"Fn::GetAtt":["EcsClustergravitonclusterLifecycleHookDrainHookRoleA16C85AD","Arn"]}}}}}}}}}},"SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--arm64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--arm64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","path":"aws-ecs-integ/SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--arm64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--arm64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--arm64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","path":"aws-ecs-integ/SsmParameterValue:--aws--service--bottlerocket--aws-ecs-1--arm64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ/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.graviton.js.snapshot/aws-ecs-integ.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/aws-ecs-integ.assets.json
index 5564694c9d674..7271393db1722 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/aws-ecs-integ.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/aws-ecs-integ.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "483fcaa6452dbb760229a5b3ccdb4f7e3a95fa6077a6a30237f433220ee3650f": {
+ "3ab4a4b17ff670d16e62613a3b16e693c7162cfbe4e2e749d8ec40a0f87cb92c": {
+ "displayName": "aws-ecs-integ Template",
"source": {
"path": "aws-ecs-integ.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-a16926e9": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "483fcaa6452dbb760229a5b3ccdb4f7e3a95fa6077a6a30237f433220ee3650f.json",
+ "objectKey": "3ab4a4b17ff670d16e62613a3b16e693c7162cfbe4e2e749d8ec40a0f87cb92c.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/aws-ecs-integ.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/aws-ecs-integ.template.json
index 6bc79f03de09e..1fa242bf67a2b 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/aws-ecs-integ.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/aws-ecs-integ.template.json
@@ -755,7 +755,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/integ.json
index 5648724a9dbf0..bc388c5b7864c 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"testCases": {
"integ.graviton": {
"stacks": [
@@ -10,5 +10,6 @@
}
},
"synthContext": {},
- "enableLookups": false
+ "enableLookups": false,
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/manifest.json
index 4050678fce7a8..d9f1495bbebfd 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/483fcaa6452dbb760229a5b3ccdb4f7e3a95fa6077a6a30237f433220ee3650f.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/3ab4a4b17ff670d16e62613a3b16e693c7162cfbe4e2e749d8ec40a0f87cb92c.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -922,51 +922,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole00BEEF075": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole00BEEF075",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole1E7E6BDCA": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole1E7E6BDCA",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole2F61512F4": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole2F61512F4",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole395D5864D": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole395D5864D",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole4A01E14CA": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClustergravitonclusterDrainECSHookFunctioninlinePolicyAddedToExecutionRole4A01E14CA",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ"
@@ -976,6 +931,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/tree.json
index a73f0ca473975..862ca60d9321d 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.graviton.js.snapshot/tree.json
@@ -1,1926 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ": {
- "id": "aws-ecs-integ",
- "path": "aws-ecs-integ",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/Vpc/Resource",
- "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-ecs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "graviton-cluster": {
- "id": "graviton-cluster",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/graviton-cluster"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceRole/Resource",
- "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-ecs-integ/EcsCluster/graviton-cluster"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceRole/DefaultPolicy/Resource",
- "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": "EcsClustergravitonclusterInstanceRoleDefaultPolicyB89DB33F",
- "roles": [
- {
- "Ref": "EcsClustergravitonclusterInstanceRole0D0E0F94"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClustergravitonclusterInstanceRole0D0E0F94"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "EcsClustergravitonclusterInstanceProfileD1BBFAAE",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2arm64recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "c6g.large",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "EcsClustergravitonclusterInstanceSecurityGroup0187E9BB",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/graviton-cluster/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "EcsClustergravitonclusterLaunchTemplate46854EA7"
- },
- "version": {
- "Fn::GetAtt": [
- "EcsClustergravitonclusterLaunchTemplate46854EA7",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "2",
- "minSize": "2",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/graviton-cluster",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ/EcsCluster/graviton-cluster"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "EcsClustergravitonclusterASG869F3168"
- }
- ]
- ]
- }
- },
- {
- "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": "EcsClustergravitonclusterDrainECSHookFunctionServiceRoleDefaultPolicy1563DC6B",
- "roles": [
- {
- "Ref": "EcsClustergravitonclusterDrainECSHookFunctionServiceRole26D97764"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": [
- "EcsClustergravitonclusterDrainECSHookFunctionServiceRole26D97764",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/graviton-cluster"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegEcsClustergravitonclusterLifecycleHookDrainHookTopicF44E68AA": {
- "id": "AllowInvoke:awsecsintegEcsClustergravitonclusterLifecycleHookDrainHookTopicF44E68AA",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/AllowInvoke:awsecsintegEcsClustergravitonclusterLifecycleHookDrainHookTopicF44E68AA",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "EcsClustergravitonclusterDrainECSHookFunctionB606E681",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClustergravitonclusterDrainECSHookFunctionB606E681",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/graviton-cluster"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ/EcsCluster/graviton-cluster"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "EcsClustergravitonclusterLifecycleHookDrainHookRoleDefaultPolicy516A6DA7",
- "roles": [
- {
- "Ref": "EcsClustergravitonclusterLifecycleHookDrainHookRoleA16C85AD"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "EcsClustergravitonclusterASG869F3168"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "EcsClustergravitonclusterLifecycleHookDrainHookRoleA16C85AD",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "machineImage": "*",
- "updateType": "Replace",
- "minCapacity": "*",
- "instanceType": "*"
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "minCapacity": "*",
- "instanceType": "*",
- "machineImage": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--arm64--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": {
- "id": "SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--arm64--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter",
- "path": "aws-ecs-integ/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--arm64--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--arm64--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118": {
- "id": "SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--arm64--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
- "path": "aws-ecs-integ/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--arm64--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ":{"id":"aws-ecs-integ","path":"aws-ecs-integ","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ/EcsCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addCapacity":["*",{"minCapacity":"*","instanceType":"*","machineImage":"*"}]},{"addAutoScalingGroup":["*",{"machineImageType":0}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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":{}}},"graviton-cluster":{"id":"graviton-cluster","path":"aws-ecs-integ/EcsCluster/graviton-cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","minCapacity":"*","instanceType":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-ecs-integ/EcsCluster/graviton-cluster/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/graviton-cluster"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/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":"EcsClustergravitonclusterInstanceRoleDefaultPolicyB89DB33F","roles":[{"Ref":"EcsClustergravitonclusterInstanceRole0D0E0F94"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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":"EcsClustergravitonclusterInstanceRole0D0E0F94"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-ecs-integ/EcsCluster/graviton-cluster/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/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":["EcsClustergravitonclusterInstanceProfileD1BBFAAE","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2arm64recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"c6g.large","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["EcsClustergravitonclusterInstanceSecurityGroup0187E9BB","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/graviton-cluster/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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":"EcsClustergravitonclusterLaunchTemplate46854EA7"},"version":{"Fn::GetAtt":["EcsClustergravitonclusterLaunchTemplate46854EA7","LatestVersionNumber"]}},"maxSize":"2","minSize":"2","tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/graviton-cluster","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/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":"EcsClustergravitonclusterASG869F3168"}]]}},{"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":"EcsClustergravitonclusterDrainECSHookFunctionServiceRoleDefaultPolicy1563DC6B","roles":[{"Ref":"EcsClustergravitonclusterDrainECSHookFunctionServiceRole26D97764"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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":["EcsClustergravitonclusterDrainECSHookFunctionServiceRole26D97764","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/graviton-cluster"}],"timeout":310}}},"AllowInvoke:awsecsintegEcsClustergravitonclusterLifecycleHookDrainHookTopicF44E68AA":{"id":"AllowInvoke:awsecsintegEcsClustergravitonclusterLifecycleHookDrainHookTopicF44E68AA","path":"aws-ecs-integ/EcsCluster/graviton-cluster/DrainECSHook/Function/AllowInvoke:awsecsintegEcsClustergravitonclusterLifecycleHookDrainHookTopicF44E68AA","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":["EcsClustergravitonclusterDrainECSHookFunctionB606E681","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"}}}},"Topic":{"id":"Topic","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/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":["EcsClustergravitonclusterDrainECSHookFunctionB606E681","Arn"]},"protocol":"lambda","topicArn":{"Ref":"EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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-ecs-integ/EcsCluster/graviton-cluster/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":"EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"}}],"Version":"2012-10-17"},"policyName":"EcsClustergravitonclusterLifecycleHookDrainHookRoleDefaultPolicy516A6DA7","roles":[{"Ref":"EcsClustergravitonclusterLifecycleHookDrainHookRoleA16C85AD"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ/EcsCluster/graviton-cluster/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":"EcsClustergravitonclusterASG869F3168"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"EcsClustergravitonclusterLifecycleHookDrainHookTopic0A778AAC"},"roleArn":{"Fn::GetAtt":["EcsClustergravitonclusterLifecycleHookDrainHookRoleA16C85AD","Arn"]}}}}}}}}}},"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--arm64--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--arm64--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","path":"aws-ecs-integ/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--arm64--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--arm64--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--arm64--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","path":"aws-ecs-integ/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--arm64--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ/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.lb-awsvpc-nw.js.snapshot/aws-ecs-integ.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/aws-ecs-integ.assets.json
index c7cefd3f2b184..0c76c1d395766 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/aws-ecs-integ.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/aws-ecs-integ.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "913448c81c058c6ba613caa9c168ef3ba21829dd2e734588eaba9bab70881260": {
+ "27a45d013bb2e6319feb0811f2da3e24e5974ffe65f3468ec9e6e8550fa39eae": {
+ "displayName": "aws-ecs-integ Template",
"source": {
"path": "aws-ecs-integ.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-c49d8b1e": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "913448c81c058c6ba613caa9c168ef3ba21829dd2e734588eaba9bab70881260.json",
+ "objectKey": "27a45d013bb2e6319feb0811f2da3e24e5974ffe65f3468ec9e6e8550fa39eae.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/aws-ecs-integ.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/aws-ecs-integ.template.json
index 781936049168a..ee6b3bde7a498 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/aws-ecs-integ.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/aws-ecs-integ.template.json
@@ -755,7 +755,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/integ.json
index 51782a9de06be..b78885161f989 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"testCases": {
"integ.lb-awsvpc-nw": {
"stacks": [
@@ -10,5 +10,6 @@
}
},
"synthContext": {},
- "enableLookups": false
+ "enableLookups": false,
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/manifest.json
index 46312cb9352c5..52624fccc9abc 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/913448c81c058c6ba613caa9c168ef3ba21829dd2e734588eaba9bab70881260.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/27a45d013bb2e6319feb0811f2da3e24e5974ffe65f3468ec9e6e8550fa39eae.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1117,51 +1117,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ"
@@ -1171,6 +1126,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/tree.json
index 56449c23882b6..cb3537ab27b2c 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-awsvpc-nw.js.snapshot/tree.json
@@ -1,2426 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ": {
- "id": "aws-ecs-integ",
- "path": "aws-ecs-integ",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/Vpc/Resource",
- "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-ecs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/ASG",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A": {
- "id": "AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "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"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ/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-ecs-integ/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-ecs-integ/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "memory": 256,
- "name": "web",
- "portMappings": [
- {
- "containerPort": 80,
- "protocol": "tcp"
- }
- ],
- "environment": [
- {
- "name": "SOME_VARIABLE",
- "value": "value"
- },
- {
- "name": "AWS_REGION",
- "value": {
- "Ref": "AWS::Region"
- }
- }
- ]
- }
- ],
- "family": "awsecsintegTaskDef6FDFB69A",
- "networkMode": "awsvpc",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "web": {
- "id": "web",
- "path": "aws-ecs-integ/TaskDef/web",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*"
- ]
- }
- },
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ/Service",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ/Service/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EcsCluster97242B84"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "healthCheckGracePeriodSeconds": 60,
- "launchType": "EC2",
- "loadBalancers": [
- {
- "targetGroupArn": {
- "Ref": "LBPublicListenerECSGroupD6A32205"
- },
- "containerName": "web",
- "containerPort": 80
- }
- ],
- "networkConfiguration": {
- "awsvpcConfiguration": {
- "assignPublicIp": "DISABLED",
- "subnets": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ],
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "ServiceSecurityGroupC96ED6A7",
- "GroupId"
- ]
- }
- ]
- }
- },
- "schedulingStrategy": "REPLICA",
- "taskDefinition": {
- "Ref": "TaskDef54694570"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-integ/Service/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/Service/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ/Service/SecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- },
- "from awsecsintegLBSecurityGroupC30F5EB4:80": {
- "id": "from awsecsintegLBSecurityGroupC30F5EB4:80",
- "path": "aws-ecs-integ/Service/SecurityGroup/from awsecsintegLBSecurityGroupC30F5EB4:80",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupIngress",
- "aws:cdk:cloudformation:props": {
- "description": "Load balancer to target",
- "fromPort": 80,
- "groupId": {
- "Fn::GetAtt": [
- "ServiceSecurityGroupC96ED6A7",
- "GroupId"
- ]
- },
- "ipProtocol": "tcp",
- "sourceSecurityGroupId": {
- "Fn::GetAtt": [
- "LBSecurityGroup8A41EA2B",
- "GroupId"
- ]
- },
- "toPort": 80
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addIngressRule": [
- "*",
- {},
- "*",
- false
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "LB": {
- "id": "LB",
- "path": "aws-ecs-integ/LB",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/LB/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
- "aws:cdk:cloudformation:props": {
- "loadBalancerAttributes": [
- {
- "key": "deletion_protection.enabled",
- "value": "false"
- }
- ],
- "scheme": "internet-facing",
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "LBSecurityGroup8A41EA2B",
- "GroupId"
- ]
- }
- ],
- "subnets": [
- {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- ],
- "type": "application"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnLoadBalancer",
- "version": "0.0.0"
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-integ/LB/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/LB/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "Automatically created Security Group for ELB awsecsintegLBC73915FE",
- "securityGroupIngress": [
- {
- "cidrIp": "0.0.0.0/0",
- "ipProtocol": "tcp",
- "fromPort": 80,
- "toPort": 80,
- "description": "Allow from anyone on port 80"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- },
- "to awsecsintegServiceSecurityGroup48EE4368:80": {
- "id": "to awsecsintegServiceSecurityGroup48EE4368:80",
- "path": "aws-ecs-integ/LB/SecurityGroup/to awsecsintegServiceSecurityGroup48EE4368:80",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupEgress",
- "aws:cdk:cloudformation:props": {
- "description": "Load balancer to target",
- "destinationSecurityGroupId": {
- "Fn::GetAtt": [
- "ServiceSecurityGroupC96ED6A7",
- "GroupId"
- ]
- },
- "fromPort": 80,
- "groupId": {
- "Fn::GetAtt": [
- "LBSecurityGroup8A41EA2B",
- "GroupId"
- ]
- },
- "ipProtocol": "tcp",
- "toPort": 80
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupEgress",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "description": "*",
- "allowAllOutbound": false
- },
- {
- "addIngressRule": [
- {
- "canInlineRule": true,
- "connections": "*",
- "uniqueId": "*"
- },
- {},
- "*",
- false
- ]
- },
- {
- "addEgressRule": [
- "*",
- {},
- "*",
- true
- ]
- }
- ]
- }
- },
- "PublicListener": {
- "id": "PublicListener",
- "path": "aws-ecs-integ/LB/PublicListener",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/LB/PublicListener/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::Listener",
- "aws:cdk:cloudformation:props": {
- "defaultActions": [
- {
- "type": "forward",
- "targetGroupArn": {
- "Ref": "LBPublicListenerECSGroupD6A32205"
- }
- }
- ],
- "loadBalancerArn": {
- "Ref": "LB8A12904C"
- },
- "port": 80,
- "protocol": "HTTP"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnListener",
- "version": "0.0.0"
- }
- },
- "ECSGroup": {
- "id": "ECSGroup",
- "path": "aws-ecs-integ/LB/PublicListener/ECSGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/LB/PublicListener/ECSGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::TargetGroup",
- "aws:cdk:cloudformation:props": {
- "port": 80,
- "protocol": "HTTP",
- "targetGroupAttributes": [
- {
- "key": "stickiness.enabled",
- "value": "false"
- }
- ],
- "targetType": "ip",
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListener",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationLoadBalancer",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "LoadBalancerDNS": {
- "id": "LoadBalancerDNS",
- "path": "aws-ecs-integ/LoadBalancerDNS",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ":{"id":"aws-ecs-integ","path":"aws-ecs-integ","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A":{"id":"AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A","path":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A","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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/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","portMappings":[{"containerPort":80,"protocol":"tcp"}],"environment":[{"name":"SOME_VARIABLE","value":"value"},{"name":"AWS_REGION","value":{"Ref":"AWS::Region"}}]}],"family":"awsecsintegTaskDef6FDFB69A","networkMode":"awsvpc","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"aws-ecs-integ/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"Service":{"id":"Service","path":"aws-ecs-integ/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ/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,"healthCheckGracePeriodSeconds":60,"launchType":"EC2","loadBalancers":[{"targetGroupArn":{"Ref":"LBPublicListenerECSGroupD6A32205"},"containerName":"web","containerPort":80}],"networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"DISABLED","subnets":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}],"securityGroups":[{"Fn::GetAtt":["ServiceSecurityGroupC96ED6A7","GroupId"]}]}},"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-integ/Service/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"},{"addIngressRule":["*",{},"*",false]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/Service/SecurityGroup/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-ecs-integ/Service/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"from awsecsintegLBSecurityGroupC30F5EB4:80":{"id":"from awsecsintegLBSecurityGroupC30F5EB4:80","path":"aws-ecs-integ/Service/SecurityGroup/from awsecsintegLBSecurityGroupC30F5EB4:80","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroupIngress","aws:cdk:cloudformation:props":{"description":"Load balancer to target","fromPort":80,"groupId":{"Fn::GetAtt":["ServiceSecurityGroupC96ED6A7","GroupId"]},"ipProtocol":"tcp","sourceSecurityGroupId":{"Fn::GetAtt":["LBSecurityGroup8A41EA2B","GroupId"]},"toPort":80}}}}}}},"LB":{"id":"LB","path":"aws-ecs-integ/LB","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationLoadBalancer","version":"0.0.0","metadata":["*","*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/LB/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnLoadBalancer","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::LoadBalancer","aws:cdk:cloudformation:props":{"loadBalancerAttributes":[{"key":"deletion_protection.enabled","value":"false"}],"scheme":"internet-facing","securityGroups":[{"Fn::GetAtt":["LBSecurityGroup8A41EA2B","GroupId"]}],"subnets":[{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},{"Ref":"VpcPublicSubnet2Subnet691E08A3"}],"type":"application"}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-integ/LB/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","description":"*","allowAllOutbound":false},{"addIngressRule":[{"canInlineRule":true,"connections":"*","uniqueId":"*"},{},"*",false]},{"addEgressRule":["*",{},"*",true]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/LB/SecurityGroup/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":"Automatically created Security Group for ELB awsecsintegLBC73915FE","securityGroupIngress":[{"cidrIp":"0.0.0.0/0","ipProtocol":"tcp","fromPort":80,"toPort":80,"description":"Allow from anyone on port 80"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"to awsecsintegServiceSecurityGroup48EE4368:80":{"id":"to awsecsintegServiceSecurityGroup48EE4368:80","path":"aws-ecs-integ/LB/SecurityGroup/to awsecsintegServiceSecurityGroup48EE4368:80","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroupEgress","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroupEgress","aws:cdk:cloudformation:props":{"description":"Load balancer to target","destinationSecurityGroupId":{"Fn::GetAtt":["ServiceSecurityGroupC96ED6A7","GroupId"]},"fromPort":80,"groupId":{"Fn::GetAtt":["LBSecurityGroup8A41EA2B","GroupId"]},"ipProtocol":"tcp","toPort":80}}}}},"PublicListener":{"id":"PublicListener","path":"aws-ecs-integ/LB/PublicListener","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListener","version":"0.0.0","metadata":["*","*","*","*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/LB/PublicListener/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnListener","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::Listener","aws:cdk:cloudformation:props":{"defaultActions":[{"type":"forward","targetGroupArn":{"Ref":"LBPublicListenerECSGroupD6A32205"}}],"loadBalancerArn":{"Ref":"LB8A12904C"},"port":80,"protocol":"HTTP"}}},"ECSGroup":{"id":"ECSGroup","path":"aws-ecs-integ/LB/PublicListener/ECSGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/LB/PublicListener/ECSGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::TargetGroup","aws:cdk:cloudformation:props":{"port":80,"protocol":"HTTP","targetGroupAttributes":[{"key":"stickiness.enabled","value":"false"}],"targetType":"ip","vpcId":{"Ref":"Vpc8378EB38"}}}}}}}}}},"LoadBalancerDNS":{"id":"LoadBalancerDNS","path":"aws-ecs-integ/LoadBalancerDNS","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ/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.lb-bridge-nw.js.snapshot/aws-ecs-integ-ecs.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/aws-ecs-integ-ecs.assets.json
index d8f8d46348a4b..c69590f60c2a6 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/aws-ecs-integ-ecs.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/aws-ecs-integ-ecs.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "f578fe236ba81abe39b7df438987885e989c4ef010c56f44601592788b07df23": {
+ "f0868905ce3e2f4902ce9bc3de8085e056c3a426a0baa0e6953e91180ef9e2d7": {
+ "displayName": "aws-ecs-integ-ecs Template",
"source": {
"path": "aws-ecs-integ-ecs.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-4e3b7302": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "f578fe236ba81abe39b7df438987885e989c4ef010c56f44601592788b07df23.json",
+ "objectKey": "f0868905ce3e2f4902ce9bc3de8085e056c3a426a0baa0e6953e91180ef9e2d7.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/aws-ecs-integ-ecs.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/aws-ecs-integ-ecs.template.json
index fac4ce6464d7b..57397329ee1ee 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/aws-ecs-integ-ecs.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/aws-ecs-integ-ecs.template.json
@@ -776,7 +776,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -792,7 +792,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/integ.json
index 2288070765769..b3b4afe7cf744 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"testCases": {
"integ.lb-bridge-nw": {
"stacks": [
@@ -10,5 +10,6 @@
}
},
"synthContext": {},
- "enableLookups": false
+ "enableLookups": false,
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/manifest.json
index 1dee76a186e5c..2861e94463f0a 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ-ecs.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/f578fe236ba81abe39b7df438987885e989c4ef010c56f44601592788b07df23.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/f0868905ce3e2f4902ce9bc3de8085e056c3a426a0baa0e6953e91180ef9e2d7.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1103,51 +1103,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ-ecs"
@@ -1157,6 +1112,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/tree.json
index 1f266f01281cc..fce18a82a7b99 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.lb-bridge-nw.js.snapshot/tree.json
@@ -1,2355 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ-ecs": {
- "id": "aws-ecs-integ-ecs",
- "path": "aws-ecs-integ-ecs",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ-ecs/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/Vpc/Resource",
- "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-ecs-integ-ecs/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ-ecs/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ-ecs/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ-ecs/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ-ecs/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ-ecs/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ-ecs/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- },
- "from awsecsintegecsLBSecurityGroup7DA90129:8080": {
- "id": "from awsecsintegecsLBSecurityGroup7DA90129:8080",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/from awsecsintegecsLBSecurityGroup7DA90129:8080",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupIngress",
- "aws:cdk:cloudformation:props": {
- "description": "Load balancer to target",
- "fromPort": 8080,
- "groupId": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231",
- "GroupId"
- ]
- },
- "ipProtocol": "tcp",
- "sourceSecurityGroupId": {
- "Fn::GetAtt": [
- "LBSecurityGroup8A41EA2B",
- "GroupId"
- ]
- },
- "toPort": 8080
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- },
- {
- "addIngressRule": [
- "*",
- {},
- "*",
- false
- ]
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/ASG",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF": {
- "id": "AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "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"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ-ecs/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ-ecs/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "memory": 256,
- "name": "web",
- "portMappings": [
- {
- "containerPort": 80,
- "hostPort": 8080,
- "protocol": "tcp"
- }
- ]
- }
- ],
- "family": "awsecsintegecsTaskDef8DD0C801",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "web": {
- "id": "web",
- "path": "aws-ecs-integ-ecs/TaskDef/web",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*"
- ]
- }
- },
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-ecs/Service",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-ecs/Service/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EcsCluster97242B84"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "healthCheckGracePeriodSeconds": 60,
- "launchType": "EC2",
- "loadBalancers": [
- {
- "targetGroupArn": {
- "Ref": "LBPublicListenerECSGroupD6A32205"
- },
- "containerName": "web",
- "containerPort": 80
- }
- ],
- "schedulingStrategy": "REPLICA",
- "taskDefinition": {
- "Ref": "TaskDef54694570"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "LB": {
- "id": "LB",
- "path": "aws-ecs-integ-ecs/LB",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/LB/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
- "aws:cdk:cloudformation:props": {
- "loadBalancerAttributes": [
- {
- "key": "deletion_protection.enabled",
- "value": "false"
- }
- ],
- "scheme": "internet-facing",
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "LBSecurityGroup8A41EA2B",
- "GroupId"
- ]
- }
- ],
- "subnets": [
- {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- ],
- "type": "application"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnLoadBalancer",
- "version": "0.0.0"
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-integ-ecs/LB/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/LB/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "Automatically created Security Group for ELB awsecsintegecsLB84BFA683",
- "securityGroupIngress": [
- {
- "cidrIp": "0.0.0.0/0",
- "ipProtocol": "tcp",
- "fromPort": 80,
- "toPort": 80,
- "description": "Allow from anyone on port 80"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- },
- "to awsecsintegecsEcsClusterDefaultAutoScalingGroupInstanceSecurityGroupE3116410:8080": {
- "id": "to awsecsintegecsEcsClusterDefaultAutoScalingGroupInstanceSecurityGroupE3116410:8080",
- "path": "aws-ecs-integ-ecs/LB/SecurityGroup/to awsecsintegecsEcsClusterDefaultAutoScalingGroupInstanceSecurityGroupE3116410:8080",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupEgress",
- "aws:cdk:cloudformation:props": {
- "description": "Load balancer to target",
- "destinationSecurityGroupId": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231",
- "GroupId"
- ]
- },
- "fromPort": 8080,
- "groupId": {
- "Fn::GetAtt": [
- "LBSecurityGroup8A41EA2B",
- "GroupId"
- ]
- },
- "ipProtocol": "tcp",
- "toPort": 8080
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupEgress",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "description": "*",
- "allowAllOutbound": false
- },
- {
- "addIngressRule": [
- {
- "canInlineRule": true,
- "connections": "*",
- "uniqueId": "*"
- },
- {},
- "*",
- false
- ]
- },
- {
- "addEgressRule": [
- "*",
- {},
- "*",
- true
- ]
- }
- ]
- }
- },
- "PublicListener": {
- "id": "PublicListener",
- "path": "aws-ecs-integ-ecs/LB/PublicListener",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/LB/PublicListener/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::Listener",
- "aws:cdk:cloudformation:props": {
- "defaultActions": [
- {
- "type": "forward",
- "targetGroupArn": {
- "Ref": "LBPublicListenerECSGroupD6A32205"
- }
- }
- ],
- "loadBalancerArn": {
- "Ref": "LB8A12904C"
- },
- "port": 80,
- "protocol": "HTTP"
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnListener",
- "version": "0.0.0"
- }
- },
- "ECSGroup": {
- "id": "ECSGroup",
- "path": "aws-ecs-integ-ecs/LB/PublicListener/ECSGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/LB/PublicListener/ECSGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ElasticLoadBalancingV2::TargetGroup",
- "aws:cdk:cloudformation:props": {
- "port": 80,
- "protocol": "HTTP",
- "targetGroupAttributes": [
- {
- "key": "stickiness.enabled",
- "value": "false"
- }
- ],
- "targetType": "instance",
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListener",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationLoadBalancer",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "LoadBalancerDNS": {
- "id": "LoadBalancerDNS",
- "path": "aws-ecs-integ-ecs/LoadBalancerDNS",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-ecs/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-ecs/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ-ecs":{"id":"aws-ecs-integ-ecs","path":"aws-ecs-integ-ecs","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-ecs/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-ecs/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-ecs/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-ecs/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ-ecs/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-ecs/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true},{"addIngressRule":["*",{},"*",false]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"from awsecsintegecsLBSecurityGroup7DA90129:8080":{"id":"from awsecsintegecsLBSecurityGroup7DA90129:8080","path":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/from awsecsintegecsLBSecurityGroup7DA90129:8080","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroupIngress","aws:cdk:cloudformation:props":{"description":"Load balancer to target","fromPort":8080,"groupId":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231","GroupId"]},"ipProtocol":"tcp","sourceSecurityGroupId":{"Fn::GetAtt":["LBSecurityGroup8A41EA2B","GroupId"]},"toPort":8080}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF":{"id":"AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF","path":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF","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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-ecs/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-ecs/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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","portMappings":[{"containerPort":80,"hostPort":8080,"protocol":"tcp"}]}],"family":"awsecsintegecsTaskDef8DD0C801","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"aws-ecs-integ-ecs/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"Service":{"id":"Service","path":"aws-ecs-integ-ecs/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ-ecs/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,"healthCheckGracePeriodSeconds":60,"launchType":"EC2","loadBalancers":[{"targetGroupArn":{"Ref":"LBPublicListenerECSGroupD6A32205"},"containerName":"web","containerPort":80}],"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"LB":{"id":"LB","path":"aws-ecs-integ-ecs/LB","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationLoadBalancer","version":"0.0.0","metadata":["*","*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/LB/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnLoadBalancer","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::LoadBalancer","aws:cdk:cloudformation:props":{"loadBalancerAttributes":[{"key":"deletion_protection.enabled","value":"false"}],"scheme":"internet-facing","securityGroups":[{"Fn::GetAtt":["LBSecurityGroup8A41EA2B","GroupId"]}],"subnets":[{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},{"Ref":"VpcPublicSubnet2Subnet691E08A3"}],"type":"application"}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-integ-ecs/LB/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","description":"*","allowAllOutbound":false},{"addIngressRule":[{"canInlineRule":true,"connections":"*","uniqueId":"*"},{},"*",false]},{"addEgressRule":["*",{},"*",true]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/LB/SecurityGroup/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":"Automatically created Security Group for ELB awsecsintegecsLB84BFA683","securityGroupIngress":[{"cidrIp":"0.0.0.0/0","ipProtocol":"tcp","fromPort":80,"toPort":80,"description":"Allow from anyone on port 80"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"to awsecsintegecsEcsClusterDefaultAutoScalingGroupInstanceSecurityGroupE3116410:8080":{"id":"to awsecsintegecsEcsClusterDefaultAutoScalingGroupInstanceSecurityGroupE3116410:8080","path":"aws-ecs-integ-ecs/LB/SecurityGroup/to awsecsintegecsEcsClusterDefaultAutoScalingGroupInstanceSecurityGroupE3116410:8080","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroupEgress","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroupEgress","aws:cdk:cloudformation:props":{"description":"Load balancer to target","destinationSecurityGroupId":{"Fn::GetAtt":["EcsClusterDefaultAutoScalingGroupInstanceSecurityGroup912E1231","GroupId"]},"fromPort":8080,"groupId":{"Fn::GetAtt":["LBSecurityGroup8A41EA2B","GroupId"]},"ipProtocol":"tcp","toPort":8080}}}}},"PublicListener":{"id":"PublicListener","path":"aws-ecs-integ-ecs/LB/PublicListener","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationListener","version":"0.0.0","metadata":["*","*","*","*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/LB/PublicListener/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnListener","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::Listener","aws:cdk:cloudformation:props":{"defaultActions":[{"type":"forward","targetGroupArn":{"Ref":"LBPublicListenerECSGroupD6A32205"}}],"loadBalancerArn":{"Ref":"LB8A12904C"},"port":80,"protocol":"HTTP"}}},"ECSGroup":{"id":"ECSGroup","path":"aws-ecs-integ-ecs/LB/PublicListener/ECSGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationTargetGroup","version":"0.0.0"},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/LB/PublicListener/ECSGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_elasticloadbalancingv2.CfnTargetGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ElasticLoadBalancingV2::TargetGroup","aws:cdk:cloudformation:props":{"port":80,"protocol":"HTTP","targetGroupAttributes":[{"key":"stickiness.enabled","value":"false"}],"targetType":"instance","vpcId":{"Ref":"Vpc8378EB38"}}}}}}}}}},"LoadBalancerDNS":{"id":"LoadBalancerDNS","path":"aws-ecs-integ-ecs/LoadBalancerDNS","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-ecs/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-ecs/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-constraint-default-empty.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.assets.json
index 9c02a36fd8387..96033c34baf3e 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "IntegDefaultTestDeployAssert4E6713E1 Template",
"source": {
"path": "IntegDefaultTestDeployAssert4E6713E1.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack.assets.json
index b261ab263af6f..26b878592e9a5 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "7e266e55d90d8a167dc9b1545687d2ec9103fc0e7fe4fa3c31d030f07ef554c7": {
+ "74f2eb5cc3745a379c9922635cf981a13e4b6b64e00f1d2dff1ea8aefe7ebb4a": {
+ "displayName": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack Template",
"source": {
"path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-da353499": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "7e266e55d90d8a167dc9b1545687d2ec9103fc0e7fe4fa3c31d030f07ef554c7.json",
+ "objectKey": "74f2eb5cc3745a379c9922635cf981a13e4b6b64e00f1d2dff1ea8aefe7ebb4a.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack.template.json
index 8add7ae0bef23..c1621a35201a0 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack.template.json
@@ -755,7 +755,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/integ.json
index 3fd90cb6fcb8c..c5e116cc19798 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"Integ/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "Integ/DefaultTest/DeployAssert",
"assertionStackName": "IntegDefaultTestDeployAssert4E6713E1"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/manifest.json
index 246fec15b6b9a..d3411cca13dfe 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/7e266e55d90d8a167dc9b1545687d2ec9103fc0e7fe4fa3c31d030f07ef554c7.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/74f2eb5cc3745a379c9922635cf981a13e4b6b64e00f1d2dff1ea8aefe7ebb4a.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -985,51 +985,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack"
@@ -1087,6 +1042,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/tree.json
index 13a4053b52b10..ff5612178f76f 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-constraint-default-empty.js.snapshot/tree.json
@@ -1,2127 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack": {
- "id": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack",
- "children": {
- "VPC": {
- "id": "VPC",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/Resource",
- "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-integ-test-with-empty-placement-constraint-stack/VPC"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1/Subnet",
- "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-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPublicSubnet1RouteTableFEE4B781"
- },
- "subnetId": {
- "Ref": "VPCPublicSubnet1SubnetB4246D30"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "routeTableId": {
- "Ref": "VPCPublicSubnet1RouteTableFEE4B781"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1/NATGateway",
- "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-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2/Subnet",
- "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-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPublicSubnet2RouteTable6F1A15F1"
- },
- "subnetId": {
- "Ref": "VPCPublicSubnet2Subnet74179F39"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "routeTableId": {
- "Ref": "VPCPublicSubnet2RouteTable6F1A15F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2/NATGateway",
- "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-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet1/Subnet",
- "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-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPrivateSubnet1RouteTableBE8A6027"
- },
- "subnetId": {
- "Ref": "VPCPrivateSubnet1Subnet8BCA10E0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VPCPublicSubnet1NATGatewayE0556630"
- },
- "routeTableId": {
- "Ref": "VPCPrivateSubnet1RouteTableBE8A6027"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet2/Subnet",
- "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-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPrivateSubnet2RouteTable0A19E10E"
- },
- "subnetId": {
- "Ref": "VPCPrivateSubnet2SubnetCFCDAA7A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VPCPublicSubnet2NATGateway3C070193"
- },
- "routeTableId": {
- "Ref": "VPCPrivateSubnet2RouteTable0A19E10E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/ASG",
- "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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VPCPrivateSubnet1Subnet8BCA10E0"
- },
- {
- "Ref": "VPCPrivateSubnet2SubnetCFCDAA7A"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awscdkecsintegtestwithemptyplacementconstraintstackEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic9E22C7D9": {
- "id": "AllowInvoke:awscdkecsintegtestwithemptyplacementconstraintstackEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic9E22C7D9",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awscdkecsintegtestwithemptyplacementconstraintstackEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic9E22C7D9",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "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"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/TaskDef/Resource",
- "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": "awscdkecsintegtestwithemptyplacementconstraintstackTaskDef2E5DA7C2",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "web": {
- "id": "web",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/TaskDef/web",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*"
- ]
- }
- },
- "Test_Stack": {
- "id": "Test_Stack",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/Test_Stack",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/Test_Stack/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EcsCluster97242B84"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "launchType": "EC2",
- "placementConstraints": [],
- "schedulingStrategy": "REPLICA",
- "taskDefinition": {
- "Ref": "TaskDef54694570"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*"
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Integ": {
- "id": "Integ",
- "path": "Integ",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "Integ/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "Integ/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "Integ/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "Integ/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "Integ/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack":{"id":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"VPC":{"id":"VPC","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/VPC"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/VPC/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/VPC"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VPCPrivateSubnet1Subnet8BCA10E0"},{"Ref":"VPCPrivateSubnet2SubnetCFCDAA7A"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awscdkecsintegtestwithemptyplacementconstraintstackEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic9E22C7D9":{"id":"AllowInvoke:awscdkecsintegtestwithemptyplacementconstraintstackEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic9E22C7D9","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awscdkecsintegtestwithemptyplacementconstraintstackEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic9E22C7D9","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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-stack/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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-integ-test-with-empty-placement-constraint-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":"awscdkecsintegtestwithemptyplacementconstraintstackTaskDef2E5DA7C2","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"Test_Stack":{"id":"Test_Stack","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/Test_Stack","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*","*"]},"children":{"Service":{"id":"Service","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-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","placementConstraints":[],"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-cdk-ecs-integ-test-with-empty-placement-constraint-stack/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"Integ":{"id":"Integ","path":"Integ","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"Integ/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"Integ/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"Integ/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"Integ/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"Integ/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.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
index ee966b65226ad..fad9e7067f6bf 100644
--- 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
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "aea815695deca6fe52208952a0a9deab404ed3d60917de00180b2395c60013f8": {
+ "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": {
+ "current_account-current_region-03b9e879": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "aea815695deca6fe52208952a0a9deab404ed3d60917de00180b2395c60013f8.json",
+ "objectKey": "59dbe7102301a129565a9d0ffcc60b8a5063ca07ff546bcd6f384ffd9857b080.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
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/aws-cdk-ecs-integration-test-stack.template.json
index b93132a659692..dfdc07e1b61d7 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/aws-cdk-ecs-integration-test-stack.template.json
@@ -755,7 +755,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
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 91e1a8b9901d5..3704a1b682acf 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":"39.0.0"}
\ No newline at end of file
+{"version":"45.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/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/integ.json
index 4cb8e75c5c417..fd337ef8d2812 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,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"testCases": {
"integ.placement-strategies": {
"stacks": [
@@ -10,5 +10,6 @@
}
},
"synthContext": {},
- "enableLookups": false
+ "enableLookups": false,
+ "minimumCliVersion": "2.1023.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 9b6379f3ee029..eaf3d2135d27e 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,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-cdk-ecs-integration-test-stack.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/aea815695deca6fe52208952a0a9deab404ed3d60917de00180b2395c60013f8.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/59dbe7102301a129565a9d0ffcc60b8a5063ca07ff546bcd6f384ffd9857b080.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -981,51 +981,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-cdk-ecs-integration-test-stack"
@@ -1035,6 +990,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.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 b2f8c215a8a55..046f8ffec11a8 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,2081 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-cdk-ecs-integration-test-stack": {
- "id": "aws-cdk-ecs-integration-test-stack",
- "path": "aws-cdk-ecs-integration-test-stack",
- "children": {
- "VPC": {
- "id": "VPC",
- "path": "aws-cdk-ecs-integration-test-stack/VPC",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/Subnet",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "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",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPublicSubnet1RouteTableFEE4B781"
- },
- "subnetId": {
- "Ref": "VPCPublicSubnet1SubnetB4246D30"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "routeTableId": {
- "Ref": "VPCPublicSubnet1RouteTableFEE4B781"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/EIP",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet1/NATGateway",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/Subnet",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "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",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPublicSubnet2RouteTable6F1A15F1"
- },
- "subnetId": {
- "Ref": "VPCPublicSubnet2Subnet74179F39"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "routeTableId": {
- "Ref": "VPCPublicSubnet2RouteTable6F1A15F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/EIP",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PublicSubnet2/NATGateway",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1/Subnet",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "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",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPrivateSubnet1RouteTableBE8A6027"
- },
- "subnetId": {
- "Ref": "VPCPrivateSubnet1Subnet8BCA10E0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VPCPublicSubnet1NATGatewayE0556630"
- },
- "routeTableId": {
- "Ref": "VPCPrivateSubnet1RouteTableBE8A6027"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2/Subnet",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "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",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VPCPrivateSubnet2RouteTable0A19E10E"
- },
- "subnetId": {
- "Ref": "VPCPrivateSubnet2SubnetCFCDAA7A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VPCPublicSubnet2NATGateway3C070193"
- },
- "routeTableId": {
- "Ref": "VPCPrivateSubnet2RouteTable0A19E10E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-cdk-ecs-integration-test-stack/VPC"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-cdk-ecs-integration-test-stack/VPC/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VPCIGWB7E252D3"
- },
- "vpcId": {
- "Ref": "VPCB9E5F0B4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole",
- "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",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "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",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "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"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/ASG",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "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",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awscdkecsintegrationteststackEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicD01B2572": {
- "id": "AllowInvoke:awscdkecsintegrationteststackEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicD01B2572",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awscdkecsintegrationteststackEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicD01B2572",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "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",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integration-test-stack/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "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"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-cdk-ecs-integration-test-stack/TaskDef/TaskRole",
- "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",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-cdk-ecs-integration-test-stack/TaskDef/Resource",
- "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"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "web": {
- "id": "web",
- "path": "aws-cdk-ecs-integration-test-stack/TaskDef/web",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*"
- ]
- }
- },
- "Test_Stack": {
- "id": "Test_Stack",
- "path": "aws-cdk-ecs-integration-test-stack/Test_Stack",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-cdk-ecs-integration-test-stack/Test_Stack/Service",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"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
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/PseudoTerminalDefaultTestDeployAssert1B88B826.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/PseudoTerminalDefaultTestDeployAssert1B88B826.assets.json
index d3deab3846f96..715e262da7fe7 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/PseudoTerminalDefaultTestDeployAssert1B88B826.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/PseudoTerminalDefaultTestDeployAssert1B88B826.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "PseudoTerminalDefaultTestDeployAssert1B88B826 Template",
"source": {
"path": "PseudoTerminalDefaultTestDeployAssert1B88B826.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/aws-ecs-integ-pseudo-terminal.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/aws-ecs-integ-pseudo-terminal.assets.json
index 10f4be0640bb0..13eb1d925af1b 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/aws-ecs-integ-pseudo-terminal.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/aws-ecs-integ-pseudo-terminal.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "1c599d4c062054e819da12b248d63f08943a4da2fa013473aa52a4ca4af84a73": {
+ "fc8614ff0901d1039bd104339e2d18a7b3a2119d1dfc3826a22b5de4d30787a7": {
+ "displayName": "aws-ecs-integ-pseudo-terminal Template",
"source": {
"path": "aws-ecs-integ-pseudo-terminal.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-98bba594": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "1c599d4c062054e819da12b248d63f08943a4da2fa013473aa52a4ca4af84a73.json",
+ "objectKey": "fc8614ff0901d1039bd104339e2d18a7b3a2119d1dfc3826a22b5de4d30787a7.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/aws-ecs-integ-pseudo-terminal.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/aws-ecs-integ-pseudo-terminal.template.json
index 61e0cf4782f5e..37b8eed76eb34 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/aws-ecs-integ-pseudo-terminal.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/aws-ecs-integ-pseudo-terminal.template.json
@@ -755,7 +755,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/integ.json
index a4dca987e218d..4a41a43c718f3 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"PseudoTerminal/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "PseudoTerminal/DefaultTest/DeployAssert",
"assertionStackName": "PseudoTerminalDefaultTestDeployAssert1B88B826"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/manifest.json
index d0c4bd408284d..49a0ea14a5229 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ-pseudo-terminal.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/1c599d4c062054e819da12b248d63f08943a4da2fa013473aa52a4ca4af84a73.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/fc8614ff0901d1039bd104339e2d18a7b3a2119d1dfc3826a22b5de4d30787a7.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -996,51 +996,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ-pseudo-terminal"
@@ -1098,6 +1053,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/tree.json
index 9c3af32bab691..4c9a9bee0ca36 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.pseudo-terminal.js.snapshot/tree.json
@@ -1,2195 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ-pseudo-terminal": {
- "id": "aws-ecs-integ-pseudo-terminal",
- "path": "aws-ecs-integ-pseudo-terminal",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/Resource",
- "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-ecs-integ-pseudo-terminal/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-pseudo-terminal/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ-pseudo-terminal/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/ASG",
- "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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegpseudoterminalEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic8C590529": {
- "id": "AllowInvoke:awsecsintegpseudoterminalEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic8C590529",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegpseudoterminalEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic8C590529",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "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"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ-pseudo-terminal/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ-pseudo-terminal/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "memory": 256,
- "name": "web",
- "pseudoTerminal": true,
- "environment": [
- {
- "name": "AWS_REGION",
- "value": {
- "Ref": "AWS::Region"
- }
- }
- ]
- }
- ],
- "family": "awsecsintegpseudoterminalTaskDefA7C50734",
- "networkMode": "awsvpc",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "web": {
- "id": "web",
- "path": "aws-ecs-integ-pseudo-terminal/TaskDef/web",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*"
- ]
- }
- },
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-pseudo-terminal/Service",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-pseudo-terminal/Service/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EcsCluster97242B84"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "launchType": "EC2",
- "networkConfiguration": {
- "awsvpcConfiguration": {
- "assignPublicIp": "DISABLED",
- "subnets": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ],
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "ServiceSecurityGroupC96ED6A7",
- "GroupId"
- ]
- }
- ]
- }
- },
- "schedulingStrategy": "REPLICA",
- "taskDefinition": {
- "Ref": "TaskDef54694570"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-integ-pseudo-terminal/Service/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-pseudo-terminal/Service/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-pseudo-terminal/Service/SecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-pseudo-terminal/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-pseudo-terminal/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "PseudoTerminal": {
- "id": "PseudoTerminal",
- "path": "PseudoTerminal",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "PseudoTerminal/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "PseudoTerminal/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "PseudoTerminal/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "PseudoTerminal/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "PseudoTerminal/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ-pseudo-terminal":{"id":"aws-ecs-integ-pseudo-terminal","path":"aws-ecs-integ-pseudo-terminal","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-pseudo-terminal/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-pseudo-terminal/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-pseudo-terminal/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-pseudo-terminal/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-pseudo-terminal/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-pseudo-terminal/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-pseudo-terminal/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ-pseudo-terminal/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-pseudo-terminal/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-pseudo-terminal/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-pseudo-terminal/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-pseudo-terminal/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-pseudo-terminal/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegpseudoterminalEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic8C590529":{"id":"AllowInvoke:awsecsintegpseudoterminalEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic8C590529","path":"aws-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegpseudoterminalEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic8C590529","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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-pseudo-terminal/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-pseudo-terminal/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-pseudo-terminal/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-ecs-integ-pseudo-terminal/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","pseudoTerminal":true,"environment":[{"name":"AWS_REGION","value":{"Ref":"AWS::Region"}}]}],"family":"awsecsintegpseudoterminalTaskDefA7C50734","networkMode":"awsvpc","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"aws-ecs-integ-pseudo-terminal/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"Service":{"id":"Service","path":"aws-ecs-integ-pseudo-terminal/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ-pseudo-terminal/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","networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"DISABLED","subnets":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}],"securityGroups":[{"Fn::GetAtt":["ServiceSecurityGroupC96ED6A7","GroupId"]}]}},"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-integ-pseudo-terminal/Service/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-pseudo-terminal/Service/SecurityGroup/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-ecs-integ-pseudo-terminal/Service/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-pseudo-terminal/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-pseudo-terminal/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"PseudoTerminal":{"id":"PseudoTerminal","path":"PseudoTerminal","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"PseudoTerminal/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"PseudoTerminal/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"PseudoTerminal/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"PseudoTerminal/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"PseudoTerminal/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.sd-awsvpc-nw.js.snapshot/aws-ecs-integ-ecs.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/aws-ecs-integ-ecs.assets.json
index c5381f7898419..9e01b81ba753b 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/aws-ecs-integ-ecs.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/aws-ecs-integ-ecs.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "9f1102957d61953ed6bfe32962b79376c3053b1c8988eb6ed21d27af5c561347": {
+ "fcaf3a76315c9894751342bc9c87ccde3b7fa14959fe88d4bf996332c48ffb49": {
+ "displayName": "aws-ecs-integ-ecs Template",
"source": {
"path": "aws-ecs-integ-ecs.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-602600f7": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "9f1102957d61953ed6bfe32962b79376c3053b1c8988eb6ed21d27af5c561347.json",
+ "objectKey": "fcaf3a76315c9894751342bc9c87ccde3b7fa14959fe88d4bf996332c48ffb49.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/aws-ecs-integ-ecs.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/aws-ecs-integ-ecs.template.json
index db23ae8ea4d16..ab0ae8e955067 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/aws-ecs-integ-ecs.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/aws-ecs-integ-ecs.template.json
@@ -755,7 +755,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/integ.json
index c67e49b8c887a..21a4a297ecc92 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"testCases": {
"integ.sd-awsvpc-nw": {
"stacks": [
@@ -10,5 +10,6 @@
}
},
"synthContext": {},
- "enableLookups": false
+ "enableLookups": false,
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/manifest.json
index ede58d0309517..357c9266e35a6 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ-ecs.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/9f1102957d61953ed6bfe32962b79376c3053b1c8988eb6ed21d27af5c561347.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/fcaf3a76315c9894751342bc9c87ccde3b7fa14959fe88d4bf996332c48ffb49.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1041,51 +1041,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ-ecs"
@@ -1095,6 +1050,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/tree.json
index 5be90896d82d4..207be41a83d87 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-awsvpc-nw.js.snapshot/tree.json
@@ -1,2256 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ-ecs": {
- "id": "aws-ecs-integ-ecs",
- "path": "aws-ecs-integ-ecs",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ-ecs/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/Vpc/Resource",
- "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-ecs-integ-ecs/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ-ecs/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ-ecs/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ-ecs/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ-ecs/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ-ecs/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ-ecs/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/ASG",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF": {
- "id": "AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "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"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "DefaultServiceDiscoveryNamespace": {
- "id": "DefaultServiceDiscoveryNamespace",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultServiceDiscoveryNamespace",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultServiceDiscoveryNamespace/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ServiceDiscovery::PrivateDnsNamespace",
- "aws:cdk:cloudformation:props": {
- "name": "scorekeep.com",
- "vpc": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_servicediscovery.CfnPrivateDnsNamespace",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_servicediscovery.PrivateDnsNamespace",
- "version": "0.0.0",
- "metadata": [
- {
- "name": "*",
- "vpc": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- },
- {
- "addDefaultCloudMapNamespace": [
- {
- "name": "*"
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ-ecs/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ-ecs/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "memory": 256,
- "name": "frontend",
- "portMappings": [
- {
- "containerPort": 80,
- "hostPort": 80,
- "protocol": "tcp"
- }
- ],
- "environment": [
- {
- "name": "AWS_REGION",
- "value": {
- "Ref": "AWS::Region"
- }
- }
- ]
- }
- ],
- "family": "awsecsintegecsTaskDef8DD0C801",
- "networkMode": "awsvpc",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "frontend": {
- "id": "frontend",
- "path": "aws-ecs-integ-ecs/TaskDef/frontend",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*"
- ]
- }
- },
- "FrontendService": {
- "id": "FrontendService",
- "path": "aws-ecs-integ-ecs/FrontendService",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-ecs/FrontendService/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EcsCluster97242B84"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "launchType": "EC2",
- "networkConfiguration": {
- "awsvpcConfiguration": {
- "assignPublicIp": "DISABLED",
- "subnets": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ],
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "FrontendServiceSecurityGroup85470DEC",
- "GroupId"
- ]
- }
- ]
- }
- },
- "schedulingStrategy": "REPLICA",
- "serviceRegistries": [
- {
- "registryArn": {
- "Fn::GetAtt": [
- "FrontendServiceCloudmapService6FE76C06",
- "Arn"
- ]
- }
- }
- ],
- "taskDefinition": {
- "Ref": "TaskDef54694570"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- },
- "CloudmapService": {
- "id": "CloudmapService",
- "path": "aws-ecs-integ-ecs/FrontendService/CloudmapService",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/FrontendService/CloudmapService/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ServiceDiscovery::Service",
- "aws:cdk:cloudformation:props": {
- "dnsConfig": {
- "dnsRecords": [
- {
- "type": "A",
- "ttl": 60
- }
- ],
- "namespaceId": {
- "Fn::GetAtt": [
- "EcsClusterDefaultServiceDiscoveryNamespaceB0971B2F",
- "Id"
- ]
- },
- "routingPolicy": "MULTIVALUE"
- },
- "healthCheckCustomConfig": {
- "failureThreshold": 1
- },
- "name": "frontend",
- "namespaceId": {
- "Fn::GetAtt": [
- "EcsClusterDefaultServiceDiscoveryNamespaceB0971B2F",
- "Id"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_servicediscovery.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_servicediscovery.Service",
- "version": "0.0.0",
- "metadata": [
- {
- "namespace": "*",
- "name": "*",
- "dnsRecordType": "A",
- "customHealthCheck": {
- "failureThreshold": "*"
- },
- "dnsTtl": "*"
- }
- ]
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-integ-ecs/FrontendService/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/FrontendService/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-ecs/FrontendService/SecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-ecs/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-ecs/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ-ecs":{"id":"aws-ecs-integ-ecs","path":"aws-ecs-integ-ecs","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-ecs/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-ecs/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-ecs/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-ecs/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ-ecs/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-ecs/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ-ecs/EcsCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addCapacity":["*",{"instanceType":"*"}]},{"addAutoScalingGroup":["*",{"machineImageType":0}]},{"addDefaultCloudMapNamespace":[{"name":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF":{"id":"AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF","path":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF","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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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"]}}}}}}}},"DefaultServiceDiscoveryNamespace":{"id":"DefaultServiceDiscoveryNamespace","path":"aws-ecs-integ-ecs/EcsCluster/DefaultServiceDiscoveryNamespace","constructInfo":{"fqn":"aws-cdk-lib.aws_servicediscovery.PrivateDnsNamespace","version":"0.0.0","metadata":[{"name":"*","vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/EcsCluster/DefaultServiceDiscoveryNamespace/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_servicediscovery.CfnPrivateDnsNamespace","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ServiceDiscovery::PrivateDnsNamespace","aws:cdk:cloudformation:props":{"name":"scorekeep.com","vpc":{"Ref":"Vpc8378EB38"}}}}}}}},"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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-ecs/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-ecs/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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":"frontend","portMappings":[{"containerPort":80,"hostPort":80,"protocol":"tcp"}],"environment":[{"name":"AWS_REGION","value":{"Ref":"AWS::Region"}}]}],"family":"awsecsintegecsTaskDef8DD0C801","networkMode":"awsvpc","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"frontend":{"id":"frontend","path":"aws-ecs-integ-ecs/TaskDef/frontend","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"FrontendService":{"id":"FrontendService","path":"aws-ecs-integ-ecs/FrontendService","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ-ecs/FrontendService/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","networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"DISABLED","subnets":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}],"securityGroups":[{"Fn::GetAtt":["FrontendServiceSecurityGroup85470DEC","GroupId"]}]}},"schedulingStrategy":"REPLICA","serviceRegistries":[{"registryArn":{"Fn::GetAtt":["FrontendServiceCloudmapService6FE76C06","Arn"]}}],"taskDefinition":{"Ref":"TaskDef54694570"}}}},"CloudmapService":{"id":"CloudmapService","path":"aws-ecs-integ-ecs/FrontendService/CloudmapService","constructInfo":{"fqn":"aws-cdk-lib.aws_servicediscovery.Service","version":"0.0.0","metadata":[{"namespace":"*","name":"*","dnsRecordType":"A","customHealthCheck":{"failureThreshold":"*"},"dnsTtl":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/FrontendService/CloudmapService/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_servicediscovery.CfnService","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ServiceDiscovery::Service","aws:cdk:cloudformation:props":{"dnsConfig":{"dnsRecords":[{"type":"A","ttl":60}],"namespaceId":{"Fn::GetAtt":["EcsClusterDefaultServiceDiscoveryNamespaceB0971B2F","Id"]},"routingPolicy":"MULTIVALUE"},"healthCheckCustomConfig":{"failureThreshold":1},"name":"frontend","namespaceId":{"Fn::GetAtt":["EcsClusterDefaultServiceDiscoveryNamespaceB0971B2F","Id"]}}}}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-integ-ecs/FrontendService/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/FrontendService/SecurityGroup/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-ecs-integ-ecs/FrontendService/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-ecs/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-ecs/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.sd-bridge-nw.js.snapshot/aws-ecs-integ-ecs.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/aws-ecs-integ-ecs.assets.json
index 6b348c20cd68e..98f6d695a28a7 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/aws-ecs-integ-ecs.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/aws-ecs-integ-ecs.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "c637188683f8bd089a43b0b4406ca59b0982c8d14c7d87168acace16362f9019": {
+ "c0871ff3d35ab5d950c8e97ab980fc6e26c3816a8b3d51a57c35c68aadd593eb": {
+ "displayName": "aws-ecs-integ-ecs Template",
"source": {
"path": "aws-ecs-integ-ecs.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-f58466c0": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "c637188683f8bd089a43b0b4406ca59b0982c8d14c7d87168acace16362f9019.json",
+ "objectKey": "c0871ff3d35ab5d950c8e97ab980fc6e26c3816a8b3d51a57c35c68aadd593eb.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/aws-ecs-integ-ecs.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/aws-ecs-integ-ecs.template.json
index 5919e3af8945b..3c7893dd71c7d 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/aws-ecs-integ-ecs.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/aws-ecs-integ-ecs.template.json
@@ -755,7 +755,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/integ.json
index 48082e4959a21..4ee39bf47a9a2 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"testCases": {
"integ.sd-bridge-nw": {
"stacks": [
@@ -10,5 +10,6 @@
}
},
"synthContext": {},
- "enableLookups": false
+ "enableLookups": false,
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/manifest.json
index 0db7a89711ae8..04d18b5a24558 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ-ecs.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/c637188683f8bd089a43b0b4406ca59b0982c8d14c7d87168acace16362f9019.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/c0871ff3d35ab5d950c8e97ab980fc6e26c3816a8b3d51a57c35c68aadd593eb.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1027,51 +1027,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ-ecs"
@@ -1081,6 +1036,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/tree.json
index c2125d52be9b5..c4f123354b08d 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.sd-bridge-nw.js.snapshot/tree.json
@@ -1,2190 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ-ecs": {
- "id": "aws-ecs-integ-ecs",
- "path": "aws-ecs-integ-ecs",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ-ecs/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/Vpc/Resource",
- "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-ecs-integ-ecs/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ-ecs/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ-ecs/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ-ecs/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ-ecs/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ-ecs/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ-ecs/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/ASG",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF": {
- "id": "AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "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"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "DefaultServiceDiscoveryNamespace": {
- "id": "DefaultServiceDiscoveryNamespace",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultServiceDiscoveryNamespace",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultServiceDiscoveryNamespace/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ServiceDiscovery::PrivateDnsNamespace",
- "aws:cdk:cloudformation:props": {
- "name": "scorekeep.com",
- "vpc": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_servicediscovery.CfnPrivateDnsNamespace",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_servicediscovery.PrivateDnsNamespace",
- "version": "0.0.0",
- "metadata": [
- {
- "name": "*",
- "vpc": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- },
- {
- "addDefaultCloudMapNamespace": [
- {
- "name": "*"
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ-ecs/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-ecs-integ-ecs/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": []
- }
- },
- "frontendTD": {
- "id": "frontendTD",
- "path": "aws-ecs-integ-ecs/frontendTD",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ-ecs/frontendTD/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ-ecs/frontendTD/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/frontendTD/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/frontendTD/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "memory": 256,
- "name": "frontend",
- "portMappings": [
- {
- "containerPort": 80,
- "hostPort": 80,
- "protocol": "tcp"
- }
- ]
- }
- ],
- "family": "awsecsintegecsfrontendTD16AB905D",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "frontendTDTaskRole638562A0",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "frontend": {
- "id": "frontend",
- "path": "aws-ecs-integ-ecs/frontendTD/frontend",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*"
- ]
- }
- },
- "FrontendService": {
- "id": "FrontendService",
- "path": "aws-ecs-integ-ecs/FrontendService",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-ecs/FrontendService/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EcsCluster97242B84"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "launchType": "EC2",
- "schedulingStrategy": "REPLICA",
- "serviceRegistries": [
- {
- "registryArn": {
- "Fn::GetAtt": [
- "FrontendServiceCloudmapService6FE76C06",
- "Arn"
- ]
- },
- "containerName": "frontend",
- "containerPort": 80
- }
- ],
- "taskDefinition": {
- "Ref": "frontendTDB289C8FA"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- },
- "CloudmapService": {
- "id": "CloudmapService",
- "path": "aws-ecs-integ-ecs/FrontendService/CloudmapService",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/FrontendService/CloudmapService/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ServiceDiscovery::Service",
- "aws:cdk:cloudformation:props": {
- "dnsConfig": {
- "dnsRecords": [
- {
- "type": "SRV",
- "ttl": 60
- }
- ],
- "namespaceId": {
- "Fn::GetAtt": [
- "EcsClusterDefaultServiceDiscoveryNamespaceB0971B2F",
- "Id"
- ]
- },
- "routingPolicy": "MULTIVALUE"
- },
- "healthCheckCustomConfig": {
- "failureThreshold": 1
- },
- "name": "frontend",
- "namespaceId": {
- "Fn::GetAtt": [
- "EcsClusterDefaultServiceDiscoveryNamespaceB0971B2F",
- "Id"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_servicediscovery.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_servicediscovery.Service",
- "version": "0.0.0",
- "metadata": [
- {
- "namespace": "*",
- "name": "*",
- "dnsRecordType": "SRV",
- "customHealthCheck": {
- "failureThreshold": "*"
- },
- "dnsTtl": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-ecs/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-ecs/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ-ecs":{"id":"aws-ecs-integ-ecs","path":"aws-ecs-integ-ecs","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-ecs/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-ecs/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-ecs/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-ecs/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ-ecs/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-ecs/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ-ecs/EcsCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addCapacity":["*",{"instanceType":"*"}]},{"addAutoScalingGroup":["*",{"machineImageType":0}]},{"addDefaultCloudMapNamespace":[{"name":"*"}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF":{"id":"AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF","path":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF","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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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"]}}}}}}}},"DefaultServiceDiscoveryNamespace":{"id":"DefaultServiceDiscoveryNamespace","path":"aws-ecs-integ-ecs/EcsCluster/DefaultServiceDiscoveryNamespace","constructInfo":{"fqn":"aws-cdk-lib.aws_servicediscovery.PrivateDnsNamespace","version":"0.0.0","metadata":[{"name":"*","vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/EcsCluster/DefaultServiceDiscoveryNamespace/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_servicediscovery.CfnPrivateDnsNamespace","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ServiceDiscovery::PrivateDnsNamespace","aws:cdk:cloudformation:props":{"name":"scorekeep.com","vpc":{"Ref":"Vpc8378EB38"}}}}}}}},"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-ecs-integ-ecs/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-ecs-integ-ecs/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":[]}},"frontendTD":{"id":"frontendTD","path":"aws-ecs-integ-ecs/frontendTD","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-ecs/frontendTD/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-ecs/frontendTD/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/frontendTD/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-ecs-integ-ecs/frontendTD/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":"frontend","portMappings":[{"containerPort":80,"hostPort":80,"protocol":"tcp"}]}],"family":"awsecsintegecsfrontendTD16AB905D","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["frontendTDTaskRole638562A0","Arn"]}}}},"frontend":{"id":"frontend","path":"aws-ecs-integ-ecs/frontendTD/frontend","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"FrontendService":{"id":"FrontendService","path":"aws-ecs-integ-ecs/FrontendService","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ-ecs/FrontendService/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","schedulingStrategy":"REPLICA","serviceRegistries":[{"registryArn":{"Fn::GetAtt":["FrontendServiceCloudmapService6FE76C06","Arn"]},"containerName":"frontend","containerPort":80}],"taskDefinition":{"Ref":"frontendTDB289C8FA"}}}},"CloudmapService":{"id":"CloudmapService","path":"aws-ecs-integ-ecs/FrontendService/CloudmapService","constructInfo":{"fqn":"aws-cdk-lib.aws_servicediscovery.Service","version":"0.0.0","metadata":[{"namespace":"*","name":"*","dnsRecordType":"SRV","customHealthCheck":{"failureThreshold":"*"},"dnsTtl":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/FrontendService/CloudmapService/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_servicediscovery.CfnService","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ServiceDiscovery::Service","aws:cdk:cloudformation:props":{"dnsConfig":{"dnsRecords":[{"type":"SRV","ttl":60}],"namespaceId":{"Fn::GetAtt":["EcsClusterDefaultServiceDiscoveryNamespaceB0971B2F","Id"]},"routingPolicy":"MULTIVALUE"},"healthCheckCustomConfig":{"failureThreshold":1},"name":"frontend","namespaceId":{"Fn::GetAtt":["EcsClusterDefaultServiceDiscoveryNamespaceB0971B2F","Id"]}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-ecs/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-ecs/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.spot-drain.js.snapshot/aws-ecs-integ-spot.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/aws-ecs-integ-spot.assets.json
index 9962a49ab656a..1e46c61ba2cce 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/aws-ecs-integ-spot.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/aws-ecs-integ-spot.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "cf00b8198a39732704b1095530660c98a6d05146b8860ce8d8630847e4c16d70": {
+ "f5ecc9635601cfd66ac15b93ca9285f23b96568cae5d25fedfea038288fb0c6d": {
+ "displayName": "aws-ecs-integ-spot Template",
"source": {
"path": "aws-ecs-integ-spot.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-b1077eb6": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "cf00b8198a39732704b1095530660c98a6d05146b8860ce8d8630847e4c16d70.json",
+ "objectKey": "f5ecc9635601cfd66ac15b93ca9285f23b96568cae5d25fedfea038288fb0c6d.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/aws-ecs-integ-spot.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/aws-ecs-integ-spot.template.json
index d40df2075c422..b4b7d9e81682e 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/aws-ecs-integ-spot.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/aws-ecs-integ-spot.template.json
@@ -762,7 +762,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -778,7 +778,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1266,7 +1266,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -1282,7 +1282,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/integ.json
index cc1ada5914a88..e772d85374851 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"testCases": {
"integ.spot-drain": {
"stacks": [
@@ -10,5 +10,6 @@
}
},
"synthContext": {},
- "enableLookups": false
+ "enableLookups": false,
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/manifest.json
index 685a0a12ab983..176d3c872c592 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ-spot.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/cf00b8198a39732704b1095530660c98a6d05146b8860ce8d8630847e4c16d70.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/f5ecc9635601cfd66ac15b93ca9285f23b96568cae5d25fedfea038288fb0c6d.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1587,96 +1587,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterasgSpotDrainECSHookFunctioninlinePolicyAddedToExecutionRole09C74CDAF": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterasgSpotDrainECSHookFunctioninlinePolicyAddedToExecutionRole09C74CDAF",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterasgSpotDrainECSHookFunctioninlinePolicyAddedToExecutionRole18626061D": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterasgSpotDrainECSHookFunctioninlinePolicyAddedToExecutionRole18626061D",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterasgSpotDrainECSHookFunctioninlinePolicyAddedToExecutionRole2225E6E90": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterasgSpotDrainECSHookFunctioninlinePolicyAddedToExecutionRole2225E6E90",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterasgSpotDrainECSHookFunctioninlinePolicyAddedToExecutionRole35C617151": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterasgSpotDrainECSHookFunctioninlinePolicyAddedToExecutionRole35C617151",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterasgSpotDrainECSHookFunctioninlinePolicyAddedToExecutionRole43F8D9D49": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterasgSpotDrainECSHookFunctioninlinePolicyAddedToExecutionRole43F8D9D49",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterasgOdDrainECSHookFunctioninlinePolicyAddedToExecutionRole094FADA95": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterasgOdDrainECSHookFunctioninlinePolicyAddedToExecutionRole094FADA95",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterasgOdDrainECSHookFunctioninlinePolicyAddedToExecutionRole14F1028A8": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterasgOdDrainECSHookFunctioninlinePolicyAddedToExecutionRole14F1028A8",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterasgOdDrainECSHookFunctioninlinePolicyAddedToExecutionRole2274F3C3D": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterasgOdDrainECSHookFunctioninlinePolicyAddedToExecutionRole2274F3C3D",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterasgOdDrainECSHookFunctioninlinePolicyAddedToExecutionRole35969A0F5": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterasgOdDrainECSHookFunctioninlinePolicyAddedToExecutionRole35969A0F5",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterasgOdDrainECSHookFunctioninlinePolicyAddedToExecutionRole48C7C27F2": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterasgOdDrainECSHookFunctioninlinePolicyAddedToExecutionRole48C7C27F2",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ-spot"
@@ -1686,6 +1596,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/tree.json
index 2a1acbdf85646..aa9950e8f6323 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.spot-drain.js.snapshot/tree.json
@@ -1,3202 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ-spot": {
- "id": "aws-ecs-integ-spot",
- "path": "aws-ecs-integ-spot",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ-spot/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/Vpc/Resource",
- "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-ecs-integ-spot/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ-spot/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ-spot/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-spot/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ-spot/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-spot/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ-spot/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-spot/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-spot/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-spot/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-spot/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ-spot/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-spot/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ-spot/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-spot/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-spot/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-spot/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-spot/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ-spot/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ-spot/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ-spot/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "asgSpot": {
- "id": "asgSpot",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-spot/EcsCluster/asgSpot/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/EcsCluster/asgSpot"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/InstanceRole/Resource",
- "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-ecs-integ-spot/EcsCluster/asgSpot"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/InstanceRole/DefaultPolicy/Resource",
- "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": "EcsClusterasgSpotInstanceRoleDefaultPolicyB1E3ABFA",
- "roles": [
- {
- "Ref": "EcsClusterasgSpotInstanceRole84AB6F93"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterasgSpotInstanceRole84AB6F93"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "EcsClusterasgSpotInstanceProfile0D6DD08D",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "c5.xlarge",
- "instanceMarketOptions": {
- "marketType": "spot",
- "spotOptions": {
- "maxPrice": "0.0735"
- }
- },
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "EcsClusterasgSpotInstanceSecurityGroupEA17787D",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/EcsCluster/asgSpot/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/EcsCluster/asgSpot/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\necho ECS_ENABLE_SPOT_INSTANCE_DRAINING=true >> /etc/ecs/ecs.config"
- ]
- ]
- }
- }
- },
- "tagSpecifications": [
- {
- "resourceType": "launch-template",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/EcsCluster/asgSpot/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": {
- "maxPrice": "*"
- },
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "desiredCapacity": "3",
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "EcsClusterasgSpotLaunchTemplateA53AD60C"
- },
- "version": {
- "Fn::GetAtt": [
- "EcsClusterasgSpotLaunchTemplateA53AD60C",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "3",
- "minSize": "3",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/EcsCluster/asgSpot",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ-spot/EcsCluster/asgSpot"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "EcsClusterasgSpotASG0D77F041"
- }
- ]
- ]
- }
- },
- {
- "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": "EcsClusterasgSpotDrainECSHookFunctionServiceRoleDefaultPolicy96377D7C",
- "roles": [
- {
- "Ref": "EcsClusterasgSpotDrainECSHookFunctionServiceRole8EEDDFE0"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": [
- "EcsClusterasgSpotDrainECSHookFunctionServiceRole8EEDDFE0",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/EcsCluster/asgSpot"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegspotEcsClusterasgSpotLifecycleHookDrainHookTopic92E2845E": {
- "id": "AllowInvoke:awsecsintegspotEcsClusterasgSpotLifecycleHookDrainHookTopic92E2845E",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/DrainECSHook/Function/AllowInvoke:awsecsintegspotEcsClusterasgSpotLifecycleHookDrainHookTopic92E2845E",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "EcsClusterasgSpotDrainECSHookFunction969F1553",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "EcsClusterasgSpotLifecycleHookDrainHookTopic6212EC83"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterasgSpotDrainECSHookFunction969F1553",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterasgSpotLifecycleHookDrainHookTopic6212EC83"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/EcsCluster/asgSpot"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ-spot/EcsCluster/asgSpot"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "EcsClusterasgSpotLifecycleHookDrainHookTopic6212EC83"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "EcsClusterasgSpotLifecycleHookDrainHookRoleDefaultPolicyFC0E3482",
- "roles": [
- {
- "Ref": "EcsClusterasgSpotLifecycleHookDrainHookRole1B427C77"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgSpot/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "EcsClusterasgSpotASG0D77F041"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "EcsClusterasgSpotLifecycleHookDrainHookTopic6212EC83"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "EcsClusterasgSpotLifecycleHookDrainHookRole1B427C77",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "machineImage": "*",
- "updateType": "Replace",
- "maxCapacity": "*",
- "minCapacity": "*",
- "desiredCapacity": "*",
- "instanceType": "*",
- "spotPrice": "*"
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- },
- "asgOd": {
- "id": "asgOd",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-spot/EcsCluster/asgOd/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/EcsCluster/asgOd"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/InstanceRole/Resource",
- "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-ecs-integ-spot/EcsCluster/asgOd"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/InstanceRole/DefaultPolicy/Resource",
- "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": "EcsClusterasgOdInstanceRoleDefaultPolicy0AE7FAB2",
- "roles": [
- {
- "Ref": "EcsClusterasgOdInstanceRoleC8290533"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterasgOdInstanceRoleC8290533"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "EcsClusterasgOdInstanceProfileE5B88756",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "t3.large",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "EcsClusterasgOdInstanceSecurityGroup301DFBED",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/EcsCluster/asgOd/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "desiredCapacity": "1",
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "EcsClusterasgOdLaunchTemplate6065F652"
- },
- "version": {
- "Fn::GetAtt": [
- "EcsClusterasgOdLaunchTemplate6065F652",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "2",
- "minSize": "1",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/EcsCluster/asgOd",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ-spot/EcsCluster/asgOd"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "EcsClusterasgOdASG0E5C30EC"
- }
- ]
- ]
- }
- },
- {
- "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": "EcsClusterasgOdDrainECSHookFunctionServiceRoleDefaultPolicyE54F1794",
- "roles": [
- {
- "Ref": "EcsClusterasgOdDrainECSHookFunctionServiceRoleFC088D55"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": [
- "EcsClusterasgOdDrainECSHookFunctionServiceRoleFC088D55",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/EcsCluster/asgOd"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegspotEcsClusterasgOdLifecycleHookDrainHookTopicB293D7D8": {
- "id": "AllowInvoke:awsecsintegspotEcsClusterasgOdLifecycleHookDrainHookTopicB293D7D8",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/DrainECSHook/Function/AllowInvoke:awsecsintegspotEcsClusterasgOdLifecycleHookDrainHookTopicB293D7D8",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "EcsClusterasgOdDrainECSHookFunction962490E0",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "EcsClusterasgOdLifecycleHookDrainHookTopic673CE202"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterasgOdDrainECSHookFunction962490E0",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterasgOdLifecycleHookDrainHookTopic673CE202"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-spot/EcsCluster/asgOd"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ-spot/EcsCluster/asgOd"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "EcsClusterasgOdLifecycleHookDrainHookTopic673CE202"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "EcsClusterasgOdLifecycleHookDrainHookRoleDefaultPolicy85FA949A",
- "roles": [
- {
- "Ref": "EcsClusterasgOdLifecycleHookDrainHookRole695B2DF1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/EcsCluster/asgOd/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "EcsClusterasgOdASG0E5C30EC"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "EcsClusterasgOdLifecycleHookDrainHookTopic673CE202"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "EcsClusterasgOdLifecycleHookDrainHookRole695B2DF1",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "machineImage": "*",
- "updateType": "Replace",
- "maxCapacity": "*",
- "minCapacity": "*",
- "desiredCapacity": "*",
- "instanceType": "*"
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "maxCapacity": "*",
- "minCapacity": "*",
- "desiredCapacity": "*",
- "instanceType": "*",
- "spotPrice": "*",
- "spotInstanceDraining": true
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0,
- "spotInstanceDraining": true
- }
- ]
- },
- {
- "addCapacity": [
- "*",
- {
- "maxCapacity": "*",
- "minCapacity": "*",
- "desiredCapacity": "*",
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ-spot/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-ecs-integ-spot/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": []
- }
- },
- "Task": {
- "id": "Task",
- "path": "aws-ecs-integ-spot/Task",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ-spot/Task/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ-spot/Task/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/Task/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-spot/Task/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "memory": 512,
- "name": "PHP",
- "portMappings": [
- {
- "containerPort": 80,
- "hostPort": 0,
- "protocol": "tcp"
- }
- ]
- }
- ],
- "family": "awsecsintegspotTask1789BE14",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskTaskRoleE98524A1",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "PHP": {
- "id": "PHP",
- "path": "aws-ecs-integ-spot/Task/PHP",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-spot/Service",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ-spot/Service/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EcsCluster97242B84"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "launchType": "EC2",
- "schedulingStrategy": "REPLICA",
- "taskDefinition": {
- "Ref": "Task79114B6B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-spot/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-spot/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ-spot":{"id":"aws-ecs-integ-spot","path":"aws-ecs-integ-spot","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-spot/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/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-ecs-integ-spot/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-spot/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-ecs-integ-spot/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-ecs-integ-spot/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-spot/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-spot/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-ecs-integ-spot/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-spot/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-spot/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-spot/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-ecs-integ-spot/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-spot/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-spot/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ-spot/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-ecs-integ-spot/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-ecs-integ-spot/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-spot/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-spot/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-ecs-integ-spot/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-spot/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-spot/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-spot/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-ecs-integ-spot/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-spot/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ-spot/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-spot/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-ecs-integ-spot/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-ecs-integ-spot/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-spot/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-spot/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-ecs-integ-spot/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-spot/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-spot/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ-spot/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-ecs-integ-spot/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-ecs-integ-spot/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-spot/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-spot/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-ecs-integ-spot/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-spot/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-spot/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-spot/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-ecs-integ-spot/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-spot/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ-spot/EcsCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addCapacity":["*",{"maxCapacity":"*","minCapacity":"*","desiredCapacity":"*","instanceType":"*","spotPrice":"*","spotInstanceDraining":true}]},{"addAutoScalingGroup":["*",{"machineImageType":0,"spotInstanceDraining":true}]},{"addCapacity":["*",{"maxCapacity":"*","minCapacity":"*","desiredCapacity":"*","instanceType":"*"}]},{"addAutoScalingGroup":["*",{"machineImageType":0}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/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":{}}},"asgSpot":{"id":"asgSpot","path":"aws-ecs-integ-spot/EcsCluster/asgSpot","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","maxCapacity":"*","minCapacity":"*","desiredCapacity":"*","instanceType":"*","spotPrice":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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-ecs-integ-spot/EcsCluster/asgSpot/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-spot/EcsCluster/asgSpot"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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-ecs-integ-spot/EcsCluster/asgSpot/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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-ecs-integ-spot/EcsCluster/asgSpot"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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-ecs-integ-spot/EcsCluster/asgSpot/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":"EcsClusterasgSpotInstanceRoleDefaultPolicyB1E3ABFA","roles":[{"Ref":"EcsClusterasgSpotInstanceRole84AB6F93"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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":"EcsClusterasgSpotInstanceRole84AB6F93"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/LaunchTemplate","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.LaunchTemplate","version":"0.0.0","metadata":[{"machineImage":"*","instanceType":"*","detailedMonitoring":false,"securityGroup":"*","userData":"*","associatePublicIpAddress":"*","spotOptions":{"maxPrice":"*"},"blockDevices":"*","instanceProfile":"*","keyPair":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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":["EcsClusterasgSpotInstanceProfile0D6DD08D","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"c5.xlarge","instanceMarketOptions":{"marketType":"spot","spotOptions":{"maxPrice":"0.0735"}},"monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["EcsClusterasgSpotInstanceSecurityGroupEA17787D","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-ecs-integ-spot/EcsCluster/asgSpot/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-spot/EcsCluster/asgSpot/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\necho ECS_ENABLE_SPOT_INSTANCE_DRAINING=true >> /etc/ecs/ecs.config"]]}}},"tagSpecifications":[{"resourceType":"launch-template","tags":[{"key":"Name","value":"aws-ecs-integ-spot/EcsCluster/asgSpot/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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":{"desiredCapacity":"3","launchTemplate":{"launchTemplateId":{"Ref":"EcsClusterasgSpotLaunchTemplateA53AD60C"},"version":{"Fn::GetAtt":["EcsClusterasgSpotLaunchTemplateA53AD60C","LatestVersionNumber"]}},"maxSize":"3","minSize":"3","tags":[{"key":"Name","value":"aws-ecs-integ-spot/EcsCluster/asgSpot","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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-ecs-integ-spot/EcsCluster/asgSpot/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-ecs-integ-spot/EcsCluster/asgSpot/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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-ecs-integ-spot/EcsCluster/asgSpot"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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-ecs-integ-spot/EcsCluster/asgSpot/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":"EcsClusterasgSpotASG0D77F041"}]]}},{"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":"EcsClusterasgSpotDrainECSHookFunctionServiceRoleDefaultPolicy96377D7C","roles":[{"Ref":"EcsClusterasgSpotDrainECSHookFunctionServiceRole8EEDDFE0"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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":["EcsClusterasgSpotDrainECSHookFunctionServiceRole8EEDDFE0","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-ecs-integ-spot/EcsCluster/asgSpot"}],"timeout":310}}},"AllowInvoke:awsecsintegspotEcsClusterasgSpotLifecycleHookDrainHookTopic92E2845E":{"id":"AllowInvoke:awsecsintegspotEcsClusterasgSpotLifecycleHookDrainHookTopic92E2845E","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/DrainECSHook/Function/AllowInvoke:awsecsintegspotEcsClusterasgSpotLifecycleHookDrainHookTopic92E2845E","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":["EcsClusterasgSpotDrainECSHookFunction969F1553","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"EcsClusterasgSpotLifecycleHookDrainHookTopic6212EC83"}}}},"Topic":{"id":"Topic","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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-ecs-integ-spot/EcsCluster/asgSpot/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":["EcsClusterasgSpotDrainECSHookFunction969F1553","Arn"]},"protocol":"lambda","topicArn":{"Ref":"EcsClusterasgSpotLifecycleHookDrainHookTopic6212EC83"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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-ecs-integ-spot/EcsCluster/asgSpot/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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-ecs-integ-spot/EcsCluster/asgSpot"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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-ecs-integ-spot/EcsCluster/asgSpot/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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-ecs-integ-spot/EcsCluster/asgSpot"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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-ecs-integ-spot/EcsCluster/asgSpot/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":"EcsClusterasgSpotLifecycleHookDrainHookTopic6212EC83"}}],"Version":"2012-10-17"},"policyName":"EcsClusterasgSpotLifecycleHookDrainHookRoleDefaultPolicyFC0E3482","roles":[{"Ref":"EcsClusterasgSpotLifecycleHookDrainHookRole1B427C77"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/EcsCluster/asgSpot/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":"EcsClusterasgSpotASG0D77F041"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"EcsClusterasgSpotLifecycleHookDrainHookTopic6212EC83"},"roleArn":{"Fn::GetAtt":["EcsClusterasgSpotLifecycleHookDrainHookRole1B427C77","Arn"]}}}}}}}},"asgOd":{"id":"asgOd","path":"aws-ecs-integ-spot/EcsCluster/asgOd","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","maxCapacity":"*","minCapacity":"*","desiredCapacity":"*","instanceType":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-ecs-integ-spot/EcsCluster/asgOd/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-spot/EcsCluster/asgOd"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd/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":"EcsClusterasgOdInstanceRoleDefaultPolicy0AE7FAB2","roles":[{"Ref":"EcsClusterasgOdInstanceRoleC8290533"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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":"EcsClusterasgOdInstanceRoleC8290533"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-ecs-integ-spot/EcsCluster/asgOd/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd/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":["EcsClusterasgOdInstanceProfileE5B88756","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t3.large","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["EcsClusterasgOdInstanceSecurityGroup301DFBED","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-ecs-integ-spot/EcsCluster/asgOd/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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":{"desiredCapacity":"1","launchTemplate":{"launchTemplateId":{"Ref":"EcsClusterasgOdLaunchTemplate6065F652"},"version":{"Fn::GetAtt":["EcsClusterasgOdLaunchTemplate6065F652","LatestVersionNumber"]}},"maxSize":"2","minSize":"1","tags":[{"key":"Name","value":"aws-ecs-integ-spot/EcsCluster/asgOd","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-spot/EcsCluster/asgOd/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd/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":"EcsClusterasgOdASG0E5C30EC"}]]}},{"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":"EcsClusterasgOdDrainECSHookFunctionServiceRoleDefaultPolicyE54F1794","roles":[{"Ref":"EcsClusterasgOdDrainECSHookFunctionServiceRoleFC088D55"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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":["EcsClusterasgOdDrainECSHookFunctionServiceRoleFC088D55","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-ecs-integ-spot/EcsCluster/asgOd"}],"timeout":310}}},"AllowInvoke:awsecsintegspotEcsClusterasgOdLifecycleHookDrainHookTopicB293D7D8":{"id":"AllowInvoke:awsecsintegspotEcsClusterasgOdLifecycleHookDrainHookTopicB293D7D8","path":"aws-ecs-integ-spot/EcsCluster/asgOd/DrainECSHook/Function/AllowInvoke:awsecsintegspotEcsClusterasgOdLifecycleHookDrainHookTopicB293D7D8","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":["EcsClusterasgOdDrainECSHookFunction962490E0","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"EcsClusterasgOdLifecycleHookDrainHookTopic673CE202"}}}},"Topic":{"id":"Topic","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd/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":["EcsClusterasgOdDrainECSHookFunction962490E0","Arn"]},"protocol":"lambda","topicArn":{"Ref":"EcsClusterasgOdLifecycleHookDrainHookTopic673CE202"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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-ecs-integ-spot/EcsCluster/asgOd/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":"EcsClusterasgOdLifecycleHookDrainHookTopic673CE202"}}],"Version":"2012-10-17"},"policyName":"EcsClusterasgOdLifecycleHookDrainHookRoleDefaultPolicy85FA949A","roles":[{"Ref":"EcsClusterasgOdLifecycleHookDrainHookRole695B2DF1"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/EcsCluster/asgOd/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":"EcsClusterasgOdASG0E5C30EC"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"EcsClusterasgOdLifecycleHookDrainHookTopic673CE202"},"roleArn":{"Fn::GetAtt":["EcsClusterasgOdLifecycleHookDrainHookRole695B2DF1","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-ecs-integ-spot/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-ecs-integ-spot/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":[]}},"Task":{"id":"Task","path":"aws-ecs-integ-spot/Task","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.TaskDefinition","version":"0.0.0","metadata":["*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-spot/Task/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-spot/Task/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-spot/Task/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-ecs-integ-spot/Task/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":512,"name":"PHP","portMappings":[{"containerPort":80,"hostPort":0,"protocol":"tcp"}]}],"family":"awsecsintegspotTask1789BE14","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskTaskRoleE98524A1","Arn"]}}}},"PHP":{"id":"PHP","path":"aws-ecs-integ-spot/Task/PHP","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"Service":{"id":"Service","path":"aws-ecs-integ-spot/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ-spot/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","schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"Task79114B6B"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-spot/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-spot/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.swap-parameters.js.snapshot/SwapParametersTestDefaultTestDeployAssert4CDF4940.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/SwapParametersTestDefaultTestDeployAssert4CDF4940.assets.json
index d8521eb48ed3e..aff89939a5b3f 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/SwapParametersTestDefaultTestDeployAssert4CDF4940.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/SwapParametersTestDefaultTestDeployAssert4CDF4940.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "SwapParametersTestDefaultTestDeployAssert4CDF4940 Template",
"source": {
"path": "SwapParametersTestDefaultTestDeployAssert4CDF4940.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/aws-ecs-integ.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/aws-ecs-integ.assets.json
index 2d6024018cca1..797cd4d1a0c9e 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/aws-ecs-integ.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/aws-ecs-integ.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "c54ac818a1c0e71694d27eb067f6ad7bd948b07e39bf64d44ab2d73a3d41adc2": {
+ "430cb7c3ac7579d31372ec867c330180d224b5572ec48d3b8e958b5969926f6b": {
+ "displayName": "aws-ecs-integ Template",
"source": {
"path": "aws-ecs-integ.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-804c2690": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "c54ac818a1c0e71694d27eb067f6ad7bd948b07e39bf64d44ab2d73a3d41adc2.json",
+ "objectKey": "430cb7c3ac7579d31372ec867c330180d224b5572ec48d3b8e958b5969926f6b.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/aws-ecs-integ.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/aws-ecs-integ.template.json
index 40ac35b87f959..5aa4cd041868d 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/aws-ecs-integ.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/aws-ecs-integ.template.json
@@ -755,7 +755,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/integ.json
index 79e8e45aa28dc..ca56b88d8e4fd 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"SwapParametersTest/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "SwapParametersTest/DefaultTest/DeployAssert",
"assertionStackName": "SwapParametersTestDefaultTestDeployAssert4CDF4940"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/manifest.json
index 0abcf65e5a2a7..9064dd626eab5 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/c54ac818a1c0e71694d27eb067f6ad7bd948b07e39bf64d44ab2d73a3d41adc2.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/430cb7c3ac7579d31372ec867c330180d224b5572ec48d3b8e958b5969926f6b.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -992,51 +992,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ"
@@ -1094,6 +1049,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/tree.json
index 2ab50216ee9e1..839ae62a3315d 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.swap-parameters.js.snapshot/tree.json
@@ -1,2198 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ": {
- "id": "aws-ecs-integ",
- "path": "aws-ecs-integ",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/Vpc/Resource",
- "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-ecs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/ASG",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A": {
- "id": "AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "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"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ/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-ecs-integ/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": []
- }
- },
- "TaskDefinition": {
- "id": "TaskDefinition",
- "path": "aws-ecs-integ/TaskDefinition",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ/TaskDefinition/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ/TaskDefinition/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/TaskDefinition/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/TaskDefinition/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": "amazon/amazon-ecs-sample",
- "memory": 256,
- "name": "Container",
- "linuxParameters": {
- "maxSwap": 5120,
- "swappiness": 90,
- "capabilities": {}
- }
- }
- ],
- "family": "awsecsintegTaskDefinition11DF163D",
- "networkMode": "awsvpc",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefinitionTaskRoleFD40A61D",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "LinuxParameters": {
- "id": "LinuxParameters",
- "path": "aws-ecs-integ/LinuxParameters",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.LinuxParameters",
- "version": "0.0.0"
- }
- },
- "Container": {
- "id": "Container",
- "path": "aws-ecs-integ/Container",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ/Service",
- "children": {
- "Service": {
- "id": "Service",
- "path": "aws-ecs-integ/Service/Service",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Service",
- "aws:cdk:cloudformation:props": {
- "cluster": {
- "Ref": "EcsCluster97242B84"
- },
- "deploymentConfiguration": {
- "maximumPercent": 200,
- "minimumHealthyPercent": 50
- },
- "enableEcsManagedTags": false,
- "launchType": "EC2",
- "networkConfiguration": {
- "awsvpcConfiguration": {
- "assignPublicIp": "DISABLED",
- "subnets": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ],
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "ServiceSecurityGroupC96ED6A7",
- "GroupId"
- ]
- }
- ]
- }
- },
- "schedulingStrategy": "REPLICA",
- "taskDefinition": {
- "Ref": "TaskDefinitionB36D86D9"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnService",
- "version": "0.0.0"
- }
- },
- "SecurityGroup": {
- "id": "SecurityGroup",
- "path": "aws-ecs-integ/Service/SecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ/Service/SecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ/Service/SecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2Service",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*"
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "SwapParametersTest": {
- "id": "SwapParametersTest",
- "path": "SwapParametersTest",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "SwapParametersTest/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "SwapParametersTest/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "SwapParametersTest/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "SwapParametersTest/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "SwapParametersTest/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ":{"id":"aws-ecs-integ","path":"aws-ecs-integ","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ/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-ecs-integ/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ/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-ecs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ/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-ecs-integ/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A":{"id":"AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A","path":"aws-ecs-integ/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic7A89925A","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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/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-ecs-integ/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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-ecs-integ/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":[]}},"TaskDefinition":{"id":"TaskDefinition","path":"aws-ecs-integ/TaskDefinition","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ/TaskDefinition/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ/TaskDefinition/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ/TaskDefinition/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-ecs-integ/TaskDefinition/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":"Container","linuxParameters":{"maxSwap":5120,"swappiness":90,"capabilities":{}}}],"family":"awsecsintegTaskDefinition11DF163D","networkMode":"awsvpc","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefinitionTaskRoleFD40A61D","Arn"]}}}}}},"LinuxParameters":{"id":"LinuxParameters","path":"aws-ecs-integ/LinuxParameters","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.LinuxParameters","version":"0.0.0"}},"Container":{"id":"Container","path":"aws-ecs-integ/Container","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}},"Service":{"id":"Service","path":"aws-ecs-integ/Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-ecs-integ/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","networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"DISABLED","subnets":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}],"securityGroups":[{"Fn::GetAtt":["ServiceSecurityGroupC96ED6A7","GroupId"]}]}},"schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDefinitionB36D86D9"}}}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-integ/Service/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ/Service/SecurityGroup/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-ecs-integ/Service/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"SwapParametersTest":{"id":"SwapParametersTest","path":"SwapParametersTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"SwapParametersTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"SwapParametersTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"SwapParametersTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"SwapParametersTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"SwapParametersTest/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.task-definition-placement-constraints.js.snapshot/aws-cdk-ecs-integration-test-stack.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/aws-cdk-ecs-integration-test-stack.assets.json
index ae4393492683b..dca01220c0e74 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/aws-cdk-ecs-integration-test-stack.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/aws-cdk-ecs-integration-test-stack.assets.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"files": {
"a1acfc2b5f4f6b183fd2bb9863f486bc5edef6a357b355a070d9a0e502df418c": {
"displayName": "aws-cdk-ecs-integration-test-stack/Custom::VpcRestrictDefaultSGCustomResourceProvider Code",
@@ -15,16 +15,16 @@
}
}
},
- "bca1d4383fea9a8d064b5d24534a37dda068ddd6c466ddecdeca8bd770292569": {
+ "60b27f890f8471c4512e84ff983e5dff8c9b6b7b1ca8200969150448d2a9ab28": {
"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-ef83f5e1": {
+ "current_account-current_region-ad082b9d": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "bca1d4383fea9a8d064b5d24534a37dda068ddd6c466ddecdeca8bd770292569.json",
+ "objectKey": "60b27f890f8471c4512e84ff983e5dff8c9b6b7b1ca8200969150448d2a9ab28.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/aws-cdk-ecs-integration-test-stack.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/aws-cdk-ecs-integration-test-stack.template.json
index 00baea5b62ff6..fd5f0a842a2c9 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/aws-cdk-ecs-integration-test-stack.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/aws-cdk-ecs-integration-test-stack.template.json
@@ -871,7 +871,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -887,7 +887,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/awscdkecsintegrationteststackTaskDefinitionPlacementConstraintsDefaultTestDeployAssert906A0CF3.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/awscdkecsintegrationteststackTaskDefinitionPlacementConstraintsDefaultTestDeployAssert906A0CF3.assets.json
index ef2af15bf14e0..859fda0e1f64d 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/awscdkecsintegrationteststackTaskDefinitionPlacementConstraintsDefaultTestDeployAssert906A0CF3.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/awscdkecsintegrationteststackTaskDefinitionPlacementConstraintsDefaultTestDeployAssert906A0CF3.assets.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
"displayName": "awscdkecsintegrationteststackTaskDefinitionPlacementConstraintsDefaultTestDeployAssert906A0CF3 Template",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/cdk.out
index 3704a1b682acf..523a9aac37cbf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.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.task-definition-placement-constraints.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/integ.json
index 79b7ac8d4e21d..7c2c03d14cc93 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"testCases": {
"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints/DefaultTest": {
"stacks": [
@@ -9,5 +9,5 @@
"assertionStackName": "awscdkecsintegrationteststackTaskDefinitionPlacementConstraintsDefaultTestDeployAssert906A0CF3"
}
},
- "minimumCliVersion": "2.1020.2"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/manifest.json
index 5bbe106d5ed23..b40dcba9348bc 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/manifest.json
@@ -66,7 +66,7 @@
"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}/bca1d4383fea9a8d064b5d24534a37dda068ddd6c466ddecdeca8bd770292569.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/60b27f890f8471c4512e84ff983e5dff8c9b6b7b1ca8200969150448d2a9ab28.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1078,57 +1078,44 @@
"properties": {
"module": "aws-cdk-lib",
"flags": {
- "@aws-cdk/core:enableStackNameDuplicates": {
+ "@aws-cdk/aws-signer:signingProfileNamePassedToCfn": {
"recommendedValue": true,
- "explanation": "Allow multiple stacks with the same name"
- },
- "aws-cdk:enableDiffNoFail": {
- "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"
- },
- "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
- "recommendedValue": true,
- "explanation": "Do not specify a default DesiredCount for ECS services"
+ "explanation": "Name exports based on the construct paths relative to the stack, rather than the global construct path",
+ "unconfiguredBehavesLike": {
+ "v2": true
+ }
},
"@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,
@@ -1137,7 +1124,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,
@@ -1358,7 +1348,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,
@@ -1387,7 +1380,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,
@@ -1451,7 +1447,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,
@@ -1485,7 +1484,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,
@@ -1508,7 +1510,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,
@@ -1543,5 +1548,5 @@
}
}
},
- "minimumCliVersion": "2.1023.0"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/tree.json
index 4fb2c66756daa..68adc810b1c42 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.task-definition-placement-constraints.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":[{"maxAzs":"*"}]},"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":"Vpc8378EB38"}}}},"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":"Vpc8378EB38"}}}},"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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"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":"Vpc8378EB38"}}}},"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":"Vpc8378EB38"}}}},"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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"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":"Vpc8378EB38"}}}},"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":"Vpc8378EB38"}}}},"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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"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":"Vpc8378EB38"}}}},"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":"Vpc8378EB38"}}}},"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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"aws-cdk-ecs-integration-test-stack/Vpc/RestrictDefaultSecurityGroupCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"aws-cdk-ecs-integration-test-stack/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"aws-cdk-ecs-integration-test-stack/Custom::VpcRestrictDefaultSGCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-cdk-ecs-integration-test-stack/Custom::VpcRestrictDefaultSGCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"aws-cdk-ecs-integration-test-stack/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"aws-cdk-ecs-integration-test-stack/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"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":"Vpc8378EB38"}}}}}},"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":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"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('Got event without EC2InstanceId: %s', 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.9","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"]}}}}}}}}}},"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":"TheContainer"}],"family":"awscdkecsintegrationteststackTaskDefF811D259","networkMode":"bridge","placementConstraints":[{"type":"memberOf","expression":"attribute:ecs.instance-type =~ t2.*"}],"requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"TheContainer":{"id":"TheContainer","path":"aws-cdk-ecs-integration-test-stack/TaskDef/TheContainer","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"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":[]}},"Ec2Service":{"id":"Ec2Service","path":"aws-cdk-ecs-integration-test-stack/Ec2Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-cdk-ecs-integration-test-stack/Ec2Service/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","schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"TaskDefinitionPlacementConstraints":{"id":"TaskDefinitionPlacementConstraints","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints/DefaultTest/DeployAssert/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}}}}}},"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":{"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":[{"maxAzs":"*"}]},"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":"Vpc8378EB38"}}}},"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":"Vpc8378EB38"}}}},"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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"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":"Vpc8378EB38"}}}},"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":"Vpc8378EB38"}}}},"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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"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":"Vpc8378EB38"}}}},"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":"Vpc8378EB38"}}}},"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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"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":"Vpc8378EB38"}}}},"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":"Vpc8378EB38"}}}},"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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"aws-cdk-ecs-integration-test-stack/Vpc/RestrictDefaultSecurityGroupCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"aws-cdk-ecs-integration-test-stack/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"aws-cdk-ecs-integration-test-stack/Custom::VpcRestrictDefaultSGCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-cdk-ecs-integration-test-stack/Custom::VpcRestrictDefaultSGCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"aws-cdk-ecs-integration-test-stack/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"aws-cdk-ecs-integration-test-stack/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"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":"Vpc8378EB38"}}}}}},"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":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"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"]}}}}}}}}}},"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":"TheContainer"}],"family":"awscdkecsintegrationteststackTaskDefF811D259","networkMode":"bridge","placementConstraints":[{"type":"memberOf","expression":"attribute:ecs.instance-type =~ t2.*"}],"requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"TheContainer":{"id":"TheContainer","path":"aws-cdk-ecs-integration-test-stack/TaskDef/TheContainer","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"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":[]}},"Ec2Service":{"id":"Ec2Service","path":"aws-cdk-ecs-integration-test-stack/Ec2Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"aws-cdk-ecs-integration-test-stack/Ec2Service/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","schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"TaskDefinitionPlacementConstraints":{"id":"TaskDefinitionPlacementConstraints","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints/DefaultTest/DeployAssert/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}}}}}},"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
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/ClusterNeuronAmiDefaultTestDeployAssert0A9C16F8.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/ClusterNeuronAmiDefaultTestDeployAssert0A9C16F8.assets.json
index da113eb403cd8..575b9e22cb9be 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/ClusterNeuronAmiDefaultTestDeployAssert0A9C16F8.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/ClusterNeuronAmiDefaultTestDeployAssert0A9C16F8.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "ClusterNeuronAmiDefaultTestDeployAssert0A9C16F8 Template",
"source": {
"path": "ClusterNeuronAmiDefaultTestDeployAssert0A9C16F8.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/integ-ecs-neuron-ami.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/integ-ecs-neuron-ami.assets.json
index 903f440d04db2..d3550a6d06472 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/integ-ecs-neuron-ami.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/integ-ecs-neuron-ami.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "758add4abf782a712eea18984d2d3f66778882c56d0e19e18a2eb0a1c296430a": {
+ "a7fd914bbab8940587855e653d07196fa2a1f84c7dde09cd75cbe84b4bd93940": {
+ "displayName": "integ-ecs-neuron-ami Template",
"source": {
"path": "integ-ecs-neuron-ami.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-4fa935fd": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "758add4abf782a712eea18984d2d3f66778882c56d0e19e18a2eb0a1c296430a.json",
+ "objectKey": "a7fd914bbab8940587855e653d07196fa2a1f84c7dde09cd75cbe84b4bd93940.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/integ-ecs-neuron-ami.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/integ-ecs-neuron-ami.template.json
index 72346678779af..7a48145eb391a 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/integ-ecs-neuron-ami.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/integ-ecs-neuron-ami.template.json
@@ -766,7 +766,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -782,7 +782,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/integ.json
index 259b38d98f50f..c94f214a04c15 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"ClusterNeuronAmi/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "ClusterNeuronAmi/DefaultTest/DeployAssert",
"assertionStackName": "ClusterNeuronAmiDefaultTestDeployAssert0A9C16F8"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/manifest.json
index 308d30d92d8e1..0d8a574427fd5 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"integ-ecs-neuron-ami.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/758add4abf782a712eea18984d2d3f66778882c56d0e19e18a2eb0a1c296430a.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/a7fd914bbab8940587855e653d07196fa2a1f84c7dde09cd75cbe84b4bd93940.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -917,51 +917,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole00371FEB3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole00371FEB3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole17E852E01": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole17E852E01",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole22C962AF2": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole22C962AF2",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole3E4846C2B": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole3E4846C2B",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole48434A97B": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole48434A97B",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "integ-ecs-neuron-ami"
@@ -1019,6 +974,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/tree.json
index 135a28cc1ffba..135e715cb9d84 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-amazonlinux2-neuron-ami.js.snapshot/tree.json
@@ -1,2021 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "integ-ecs-neuron-ami": {
- "id": "integ-ecs-neuron-ami",
- "path": "integ-ecs-neuron-ami",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "integ-ecs-neuron-ami/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-neuron-ami/Vpc/Resource",
- "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": "integ-ecs-neuron-ami/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet1/Subnet",
- "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": "integ-ecs-neuron-ami/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-neuron-ami/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-neuron-ami/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-neuron-ami/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet2/Subnet",
- "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": "integ-ecs-neuron-ami/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-neuron-ami/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-neuron-ami/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "integ-ecs-neuron-ami/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-neuron-ami/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "integ-ecs-neuron-ami/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-ecs-neuron-ami/Vpc/PrivateSubnet1/Subnet",
- "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": "integ-ecs-neuron-ami/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-ecs-neuron-ami/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-ecs-neuron-ami/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-neuron-ami/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-ecs-neuron-ami/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-ecs-neuron-ami/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "integ-ecs-neuron-ami/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-ecs-neuron-ami/Vpc/PrivateSubnet2/Subnet",
- "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": "integ-ecs-neuron-ami/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-ecs-neuron-ami/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-ecs-neuron-ami/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-neuron-ami/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-ecs-neuron-ami/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-ecs-neuron-ami/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "integ-ecs-neuron-ami/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-neuron-ami/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "integ-ecs-neuron-ami/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "Cluster": {
- "id": "Cluster",
- "path": "integ-ecs-neuron-ami/Cluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-neuron-ami/Cluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "Cluster": {
- "id": "Cluster",
- "path": "integ-ecs-neuron-ami/Cluster/Cluster",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::ClusterCapacityProviderAssociations",
- "aws:cdk:cloudformation:props": {
- "capacityProviders": [
- {
- "Ref": "EC2CapacityProvider5A2E35CD"
- }
- ],
- "cluster": {
- "Ref": "ClusterEB0386A7"
- },
- "defaultCapacityProviderStrategy": []
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addAsgCapacityProvider": [
- "*"
- ]
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "integ-ecs-neuron-ami/ASG",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "integ-ecs-neuron-ami/ASG/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-neuron-ami/ASG/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "integ-ecs-neuron-ami/ASG/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-neuron-ami/ASG"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "integ-ecs-neuron-ami/ASG/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "integ-ecs-neuron-ami/ASG/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-neuron-ami/ASG/InstanceRole/Resource",
- "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": "integ-ecs-neuron-ami/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "integ-ecs-neuron-ami/ASG/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-neuron-ami/ASG/InstanceRole/DefaultPolicy/Resource",
- "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": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- },
- {
- "Action": [
- "ecs:Poll",
- "ecs:StartTelemetrySession"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecr:GetAuthorizationToken",
- "ecs:DiscoverPollEndpoint",
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ASGInstanceRoleDefaultPolicy7636D8BF",
- "roles": [
- {
- "Ref": "ASGInstanceRoleE263A41B"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "integ-ecs-neuron-ami/ASG/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "ASGInstanceRoleE263A41B"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "integ-ecs-neuron-ami/ASG/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "integ-ecs-neuron-ami/ASG/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-neuron-ami/ASG/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "ASGInstanceProfile0A2834D7",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2infrecommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "t2.micro",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "ASGInstanceSecurityGroup0525485D",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-neuron-ami/ASG/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-neuron-ami/ASG/LaunchTemplate"
- }
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "#!/bin/bash\necho ECS_CLUSTER=",
- {
- "Ref": "ClusterEB0386A7"
- },
- " >> /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": "integ-ecs-neuron-ami/ASG/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "integ-ecs-neuron-ami/ASG/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "ASGLaunchTemplate0CA92847"
- },
- "version": {
- "Fn::GetAtt": [
- "ASGLaunchTemplate0CA92847",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "1",
- "minSize": "0",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-neuron-ami/ASG",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "integ-ecs-neuron-ami/ASG/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "integ-ecs-neuron-ami/ASG/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "integ-ecs-neuron-ami/ASG/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "integ-ecs-neuron-ami/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-neuron-ami/ASG/DrainECSHook/Function/ServiceRole/Resource",
- "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": "integ-ecs-neuron-ami/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "integ-ecs-neuron-ami/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-neuron-ami/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "ASG46ED3070"
- }
- ]
- ]
- }
- },
- {
- "Action": [
- "ecs:DescribeContainerInstances",
- "ecs:DescribeTasks",
- "ecs:ListTasks",
- "ecs:UpdateContainerInstancesState"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecs:ListContainerInstances",
- "ecs:SubmitContainerStateChange",
- "ecs:SubmitTaskStateChange"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27",
- "roles": [
- {
- "Ref": "ASGDrainECSHookFunctionServiceRoleC12963BB"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-neuron-ami/ASG/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": "ClusterEB0386A7"
- }
- }
- },
- "handler": "index.lambda_handler",
- "role": {
- "Fn::GetAtt": [
- "ASGDrainECSHookFunctionServiceRoleC12963BB",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-neuron-ami/ASG"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:integecsneuronamiASGLifecycleHookDrainHookTopic1002D767": {
- "id": "AllowInvoke:integecsneuronamiASGLifecycleHookDrainHookTopic1002D767",
- "path": "integ-ecs-neuron-ami/ASG/DrainECSHook/Function/AllowInvoke:integecsneuronamiASGLifecycleHookDrainHookTopic1002D767",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "ASGDrainECSHookFunction5F24CF4D",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "integ-ecs-neuron-ami/ASG/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-neuron-ami/ASG/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "ASGDrainECSHookFunction5F24CF4D",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "integ-ecs-neuron-ami/ASG/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "integ-ecs-neuron-ami/ASG/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-neuron-ami/ASG/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-neuron-ami/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "integ-ecs-neuron-ami/ASG/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "integ-ecs-neuron-ami/ASG/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-neuron-ami/ASG/LifecycleHookDrainHook/Role/Resource",
- "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": "integ-ecs-neuron-ami/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "integ-ecs-neuron-ami/ASG/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-neuron-ami/ASG/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57",
- "roles": [
- {
- "Ref": "ASGLifecycleHookDrainHookRoleD640316C"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-neuron-ami/ASG/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "ASG46ED3070"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "ASGLifecycleHookDrainHookRoleD640316C",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "instanceType": "*",
- "machineImage": "*",
- "minCapacity": "*"
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- },
- "SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--inf--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": {
- "id": "SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--inf--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter",
- "path": "integ-ecs-neuron-ami/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--inf--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--inf--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118": {
- "id": "SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--inf--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
- "path": "integ-ecs-neuron-ami/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--inf--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "EC2CapacityProvider": {
- "id": "EC2CapacityProvider",
- "path": "integ-ecs-neuron-ami/EC2CapacityProvider",
- "children": {
- "EC2CapacityProvider": {
- "id": "EC2CapacityProvider",
- "path": "integ-ecs-neuron-ami/EC2CapacityProvider/EC2CapacityProvider",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::CapacityProvider",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupProvider": {
- "autoScalingGroupArn": {
- "Ref": "ASG46ED3070"
- },
- "managedScaling": {
- "status": "ENABLED",
- "targetCapacity": 100
- },
- "managedTerminationProtection": "DISABLED"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCapacityProvider",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.AsgCapacityProvider",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "integ-ecs-neuron-ami/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "integ-ecs-neuron-ami/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "ClusterNeuronAmi": {
- "id": "ClusterNeuronAmi",
- "path": "ClusterNeuronAmi",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "ClusterNeuronAmi/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "ClusterNeuronAmi/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "ClusterNeuronAmi/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "ClusterNeuronAmi/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "ClusterNeuronAmi/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"integ-ecs-neuron-ami":{"id":"integ-ecs-neuron-ami","path":"integ-ecs-neuron-ami","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"integ-ecs-neuron-ami/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ecs-neuron-ami/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-neuron-ami/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ecs-neuron-ami/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"integ-ecs-neuron-ami/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"integ-ecs-neuron-ami/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ecs-neuron-ami/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-neuron-ami/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ecs-neuron-ami/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"integ-ecs-neuron-ami/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"integ-ecs-neuron-ami/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ecs-neuron-ami/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-neuron-ami/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ecs-neuron-ami/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ecs-neuron-ami/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-neuron-ami/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ecs-neuron-ami/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"integ-ecs-neuron-ami/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":"integ-ecs-neuron-ami/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"integ-ecs-neuron-ami/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"Cluster":{"id":"Cluster","path":"integ-ecs-neuron-ami/Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addAsgCapacityProvider":["*"]}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-neuron-ami/Cluster/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":{}}},"Cluster":{"id":"Cluster","path":"integ-ecs-neuron-ami/Cluster/Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"Ref":"EC2CapacityProvider5A2E35CD"}],"cluster":{"Ref":"ClusterEB0386A7"},"defaultCapacityProviderStrategy":[]}}}}},"ASG":{"id":"ASG","path":"integ-ecs-neuron-ami/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","instanceType":"*","machineImage":"*","minCapacity":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"integ-ecs-neuron-ami/ASG/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-neuron-ami/ASG/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":"integ-ecs-neuron-ami/ASG/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"integ-ecs-neuron-ami/ASG"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"integ-ecs-neuron-ami/ASG/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":"integ-ecs-neuron-ami/ASG/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-neuron-ami/ASG/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":"integ-ecs-neuron-ami/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-neuron-ami/ASG/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":"integ-ecs-neuron-ami/ASG/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":["ClusterEB0386A7","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ASGInstanceRoleDefaultPolicy7636D8BF","roles":[{"Ref":"ASGInstanceRoleE263A41B"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"integ-ecs-neuron-ami/ASG/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":"ASGInstanceRoleE263A41B"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"integ-ecs-neuron-ami/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"integ-ecs-neuron-ami/ASG/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":"integ-ecs-neuron-ami/ASG/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":["ASGInstanceProfile0A2834D7","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2infrecommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ASGInstanceSecurityGroup0525485D","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"integ-ecs-neuron-ami/ASG/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"integ-ecs-neuron-ami/ASG/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"ClusterEB0386A7"}," >> /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":"integ-ecs-neuron-ami/ASG/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"integ-ecs-neuron-ami/ASG/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":"ASGLaunchTemplate0CA92847"},"version":{"Fn::GetAtt":["ASGLaunchTemplate0CA92847","LatestVersionNumber"]}},"maxSize":"1","minSize":"0","tags":[{"key":"Name","value":"integ-ecs-neuron-ami/ASG","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"integ-ecs-neuron-ami/ASG/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"integ-ecs-neuron-ami/ASG/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":"integ-ecs-neuron-ami/ASG/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":"integ-ecs-neuron-ami/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-neuron-ami/ASG/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":"integ-ecs-neuron-ami/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-neuron-ami/ASG/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":"integ-ecs-neuron-ami/ASG/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":"ASG46ED3070"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}],"Version":"2012-10-17"},"policyName":"ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27","roles":[{"Ref":"ASGDrainECSHookFunctionServiceRoleC12963BB"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-ecs-neuron-ami/ASG/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":"ClusterEB0386A7"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ASGDrainECSHookFunctionServiceRoleC12963BB","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"integ-ecs-neuron-ami/ASG"}],"timeout":310}}},"AllowInvoke:integecsneuronamiASGLifecycleHookDrainHookTopic1002D767":{"id":"AllowInvoke:integecsneuronamiASGLifecycleHookDrainHookTopic1002D767","path":"integ-ecs-neuron-ami/ASG/DrainECSHook/Function/AllowInvoke:integecsneuronamiASGLifecycleHookDrainHookTopic1002D767","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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}},"Topic":{"id":"Topic","path":"integ-ecs-neuron-ami/ASG/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":"integ-ecs-neuron-ami/ASG/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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"integ-ecs-neuron-ami/ASG/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":"integ-ecs-neuron-ami/ASG/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-neuron-ami/ASG/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":"integ-ecs-neuron-ami/ASG"}]}}}}},"Role":{"id":"Role","path":"integ-ecs-neuron-ami/ASG/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":"integ-ecs-neuron-ami/ASG/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-neuron-ami/ASG/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":"integ-ecs-neuron-ami/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-neuron-ami/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-neuron-ami/ASG/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":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}],"Version":"2012-10-17"},"policyName":"ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57","roles":[{"Ref":"ASGLifecycleHookDrainHookRoleD640316C"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-ecs-neuron-ami/ASG/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":"ASG46ED3070"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"},"roleArn":{"Fn::GetAtt":["ASGLifecycleHookDrainHookRoleD640316C","Arn"]}}}}}}}},"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--inf--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--inf--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","path":"integ-ecs-neuron-ami/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--inf--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--inf--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--inf--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","path":"integ-ecs-neuron-ami/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2--inf--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-ecs-neuron-ami/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.AsgCapacityProvider","version":"0.0.0"},"children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-ecs-neuron-ami/EC2CapacityProvider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCapacityProvider","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::CapacityProvider","aws:cdk:cloudformation:props":{"autoScalingGroupProvider":{"autoScalingGroupArn":{"Ref":"ASG46ED3070"},"managedScaling":{"status":"ENABLED","targetCapacity":100},"managedTerminationProtection":"DISABLED"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"integ-ecs-neuron-ami/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"integ-ecs-neuron-ami/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"ClusterNeuronAmi":{"id":"ClusterNeuronAmi","path":"ClusterNeuronAmi","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"ClusterNeuronAmi/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"ClusterNeuronAmi/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"ClusterNeuronAmi/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"ClusterNeuronAmi/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"ClusterNeuronAmi/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/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/aws-ecs-integ-bottlerocket-nvidia-ami.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/aws-ecs-integ-bottlerocket-nvidia-ami.assets.json
index 18fd12c4e9cee..09d843bf6de67 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/aws-ecs-integ-bottlerocket-nvidia-ami.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/aws-ecs-integ-bottlerocket-nvidia-ami.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "25ecc9ee1f79cd8a912202279ab524c1d49216ee0be93a5179ef19f50cd1b1ba": {
+ "1b364b66e39ecc0e04fbe2faa9ca24e5ec8c7da2bd01d4f78ae935b06457b1b4": {
+ "displayName": "aws-ecs-integ-bottlerocket-nvidia-ami Template",
"source": {
"path": "aws-ecs-integ-bottlerocket-nvidia-ami.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-426fd7d8": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "25ecc9ee1f79cd8a912202279ab524c1d49216ee0be93a5179ef19f50cd1b1ba.json",
+ "objectKey": "1b364b66e39ecc0e04fbe2faa9ca24e5ec8c7da2bd01d4f78ae935b06457b1b4.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/aws-ecs-integ-bottlerocket-nvidia-ami.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/aws-ecs-integ-bottlerocket-nvidia-ami.template.json
index b393e63b3fec4..755e6b2869d4f 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/aws-ecs-integ-bottlerocket-nvidia-ami.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/aws-ecs-integ-bottlerocket-nvidia-ami.template.json
@@ -781,7 +781,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -797,7 +797,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/awsecsbottlerocketnvidiaamiDefaultTestDeployAssert682D6B79.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/awsecsbottlerocketnvidiaamiDefaultTestDeployAssert682D6B79.assets.json
index d8523554d3fbc..1b5417e3b6211 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/awsecsbottlerocketnvidiaamiDefaultTestDeployAssert682D6B79.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/awsecsbottlerocketnvidiaamiDefaultTestDeployAssert682D6B79.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "awsecsbottlerocketnvidiaamiDefaultTestDeployAssert682D6B79 Template",
"source": {
"path": "awsecsbottlerocketnvidiaamiDefaultTestDeployAssert682D6B79.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/integ.json
index 59e519682d0f9..cc49840b7b14d 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"aws-ecs-bottlerocket-nvidia-ami/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "aws-ecs-bottlerocket-nvidia-ami/DefaultTest/DeployAssert",
"assertionStackName": "awsecsbottlerocketnvidiaamiDefaultTestDeployAssert682D6B79"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/manifest.json
index 233a66855addd..0f06bc980dceb 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ-bottlerocket-nvidia-ami.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/25ecc9ee1f79cd8a912202279ab524c1d49216ee0be93a5179ef19f50cd1b1ba.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/1b364b66e39ecc0e04fbe2faa9ca24e5ec8c7da2bd01d4f78ae935b06457b1b4.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -917,51 +917,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "ClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole05DFD3C41": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole05DFD3C41",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole1874CBCD0": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole1874CBCD0",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole26FBFE002": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole26FBFE002",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole3746338DC": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole3746338DC",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole49EA5332E": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ClusterbottlerocketasgDrainECSHookFunctioninlinePolicyAddedToExecutionRole49EA5332E",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ-bottlerocket-nvidia-ami"
@@ -1019,6 +974,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/tree.json
index d5d7ec8e87a4e..debbd1be2638b 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-bottlerocket-nvidia-ami.js.snapshot/tree.json
@@ -1,2008 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ-bottlerocket-nvidia-ami": {
- "id": "aws-ecs-integ-bottlerocket-nvidia-ami",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/Resource",
- "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-ecs-integ-bottlerocket-nvidia-ami/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1/Subnet",
- "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-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2/Subnet",
- "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-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet1/Subnet",
- "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-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet2/Subnet",
- "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-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "Cluster": {
- "id": "Cluster",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "bottlerocket-asg": {
- "id": "bottlerocket-asg",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/InstanceRole/Resource",
- "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"
- },
- "managedPolicyArns": [
- {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":iam::aws:policy/AmazonSSMManagedInstanceCore"
- ]
- ]
- },
- {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role"
- ]
- ]
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/InstanceRole/DefaultPolicy/Resource",
- "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": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- },
- {
- "Action": [
- "ecs:Poll",
- "ecs:StartTelemetrySession"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecr:GetAuthorizationToken",
- "ecs:DiscoverPollEndpoint",
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ClusterbottlerocketasgInstanceRoleDefaultPolicyBB6119DC",
- "roles": [
- {
- "Ref": "ClusterbottlerocketasgInstanceRoleD105ACA5"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addManagedPolicy": [
- {
- "managedPolicyArn": "*"
- }
- ]
- },
- {
- "addManagedPolicy": [
- {
- "managedPolicyArn": "*"
- }
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "ClusterbottlerocketasgInstanceRoleD105ACA5"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "ClusterbottlerocketasgInstanceProfile424C4AC3",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsservicebottlerocketawsecs2nvidiax8664latestimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "g3s.xlarge",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "ClusterbottlerocketasgInstanceSecurityGroupE1EAEF75",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LaunchTemplate"
- }
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "\n[settings.ecs]\ncluster = \"",
- {
- "Ref": "ClusterEB0386A7"
- },
- "\""
- ]
- ]
- }
- }
- },
- "tagSpecifications": [
- {
- "resourceType": "launch-template",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "ClusterbottlerocketasgLaunchTemplate45A2FA5C"
- },
- "version": {
- "Fn::GetAtt": [
- "ClusterbottlerocketasgLaunchTemplate45A2FA5C",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "1",
- "minSize": "0",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "ClusterbottlerocketasgASG5424825A"
- }
- ]
- ]
- }
- },
- {
- "Action": [
- "ecs:DescribeContainerInstances",
- "ecs:DescribeTasks",
- "ecs:ListTasks",
- "ecs:UpdateContainerInstancesState"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecs:ListContainerInstances",
- "ecs:SubmitContainerStateChange",
- "ecs:SubmitTaskStateChange"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ClusterbottlerocketasgDrainECSHookFunctionServiceRoleDefaultPolicyBD9C646C",
- "roles": [
- {
- "Ref": "ClusterbottlerocketasgDrainECSHookFunctionServiceRole91B0C3B3"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": "ClusterEB0386A7"
- }
- }
- },
- "handler": "index.lambda_handler",
- "role": {
- "Fn::GetAtt": [
- "ClusterbottlerocketasgDrainECSHookFunctionServiceRole91B0C3B3",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegbottlerocketnvidiaamiClusterbottlerocketasgLifecycleHookDrainHookTopic46897984": {
- "id": "AllowInvoke:awsecsintegbottlerocketnvidiaamiClusterbottlerocketasgLifecycleHookDrainHookTopic46897984",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/DrainECSHook/Function/AllowInvoke:awsecsintegbottlerocketnvidiaamiClusterbottlerocketasgLifecycleHookDrainHookTopic46897984",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "ClusterbottlerocketasgDrainECSHookFunctionFEA27227",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "ClusterbottlerocketasgLifecycleHookDrainHookTopic34DF3A02"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "ClusterbottlerocketasgDrainECSHookFunctionFEA27227",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "ClusterbottlerocketasgLifecycleHookDrainHookTopic34DF3A02"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "ClusterbottlerocketasgLifecycleHookDrainHookTopic34DF3A02"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ClusterbottlerocketasgLifecycleHookDrainHookRoleDefaultPolicy2C98DD9A",
- "roles": [
- {
- "Ref": "ClusterbottlerocketasgLifecycleHookDrainHookRole9E2A1D11"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "ClusterbottlerocketasgASG5424825A"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "ClusterbottlerocketasgLifecycleHookDrainHookTopic34DF3A02"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "ClusterbottlerocketasgLifecycleHookDrainHookRole9E2A1D11",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "machineImage": "*",
- "updateType": "Replace",
- "minCapacity": "*",
- "maxCapacity": "*",
- "instanceType": "*"
- },
- {
- "addUserData": [
- "*",
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "minCapacity": "*",
- "maxCapacity": "*",
- "instanceType": "*",
- "machineImage": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 1
- }
- ]
- }
- ]
- }
- },
- "SsmParameterValue:--aws--service--bottlerocket--aws-ecs-2-nvidia--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": {
- "id": "SsmParameterValue:--aws--service--bottlerocket--aws-ecs-2-nvidia--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/SsmParameterValue:--aws--service--bottlerocket--aws-ecs-2-nvidia--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "SsmParameterValue:--aws--service--bottlerocket--aws-ecs-2-nvidia--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118": {
- "id": "SsmParameterValue:--aws--service--bottlerocket--aws-ecs-2-nvidia--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/SsmParameterValue:--aws--service--bottlerocket--aws-ecs-2-nvidia--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-bottlerocket-nvidia-ami/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "aws-ecs-bottlerocket-nvidia-ami": {
- "id": "aws-ecs-bottlerocket-nvidia-ami",
- "path": "aws-ecs-bottlerocket-nvidia-ami",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "aws-ecs-bottlerocket-nvidia-ami/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "aws-ecs-bottlerocket-nvidia-ami/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "aws-ecs-bottlerocket-nvidia-ami/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-bottlerocket-nvidia-ami/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-bottlerocket-nvidia-ami/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ-bottlerocket-nvidia-ami":{"id":"aws-ecs-integ-bottlerocket-nvidia-ami","path":"aws-ecs-integ-bottlerocket-nvidia-ami","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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-ecs-integ-bottlerocket-nvidia-ami/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-bottlerocket-nvidia-ami/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"Cluster":{"id":"Cluster","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addCapacity":["*",{"minCapacity":"*","maxCapacity":"*","instanceType":"*","machineImage":"*"}]},{"addAutoScalingGroup":["*",{"machineImageType":1}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/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":{}}},"bottlerocket-asg":{"id":"bottlerocket-asg","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","minCapacity":"*","maxCapacity":"*","instanceType":"*"},{"addUserData":["*","*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/InstanceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addManagedPolicy":[{"managedPolicyArn":"*"}]},{"addManagedPolicy":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportInstanceRole":{"id":"ImportInstanceRole","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/AmazonSSMManagedInstanceCore"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role"]]}],"tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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":["ClusterEB0386A7","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ClusterbottlerocketasgInstanceRoleDefaultPolicyBB6119DC","roles":[{"Ref":"ClusterbottlerocketasgInstanceRoleD105ACA5"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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":"ClusterbottlerocketasgInstanceRoleD105ACA5"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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":["ClusterbottlerocketasgInstanceProfile424C4AC3","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsservicebottlerocketawsecs2nvidiax8664latestimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"g3s.xlarge","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ClusterbottlerocketasgInstanceSecurityGroupE1EAEF75","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["\n[settings.ecs]\ncluster = \"",{"Ref":"ClusterEB0386A7"},"\""]]}}},"tagSpecifications":[{"resourceType":"launch-template","tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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":"ClusterbottlerocketasgLaunchTemplate45A2FA5C"},"version":{"Fn::GetAtt":["ClusterbottlerocketasgLaunchTemplate45A2FA5C","LatestVersionNumber"]}},"maxSize":"1","minSize":"0","tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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":"ClusterbottlerocketasgASG5424825A"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}],"Version":"2012-10-17"},"policyName":"ClusterbottlerocketasgDrainECSHookFunctionServiceRoleDefaultPolicyBD9C646C","roles":[{"Ref":"ClusterbottlerocketasgDrainECSHookFunctionServiceRole91B0C3B3"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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":"ClusterEB0386A7"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ClusterbottlerocketasgDrainECSHookFunctionServiceRole91B0C3B3","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg"}],"timeout":310}}},"AllowInvoke:awsecsintegbottlerocketnvidiaamiClusterbottlerocketasgLifecycleHookDrainHookTopic46897984":{"id":"AllowInvoke:awsecsintegbottlerocketnvidiaamiClusterbottlerocketasgLifecycleHookDrainHookTopic46897984","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/DrainECSHook/Function/AllowInvoke:awsecsintegbottlerocketnvidiaamiClusterbottlerocketasgLifecycleHookDrainHookTopic46897984","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":["ClusterbottlerocketasgDrainECSHookFunctionFEA27227","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ClusterbottlerocketasgLifecycleHookDrainHookTopic34DF3A02"}}}},"Topic":{"id":"Topic","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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":["ClusterbottlerocketasgDrainECSHookFunctionFEA27227","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ClusterbottlerocketasgLifecycleHookDrainHookTopic34DF3A02"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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":"ClusterbottlerocketasgLifecycleHookDrainHookTopic34DF3A02"}}],"Version":"2012-10-17"},"policyName":"ClusterbottlerocketasgLifecycleHookDrainHookRoleDefaultPolicy2C98DD9A","roles":[{"Ref":"ClusterbottlerocketasgLifecycleHookDrainHookRole9E2A1D11"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-ecs-integ-bottlerocket-nvidia-ami/Cluster/bottlerocket-asg/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":"ClusterbottlerocketasgASG5424825A"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ClusterbottlerocketasgLifecycleHookDrainHookTopic34DF3A02"},"roleArn":{"Fn::GetAtt":["ClusterbottlerocketasgLifecycleHookDrainHookRole9E2A1D11","Arn"]}}}}}}}}}},"SsmParameterValue:--aws--service--bottlerocket--aws-ecs-2-nvidia--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--bottlerocket--aws-ecs-2-nvidia--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","path":"aws-ecs-integ-bottlerocket-nvidia-ami/SsmParameterValue:--aws--service--bottlerocket--aws-ecs-2-nvidia--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"SsmParameterValue:--aws--service--bottlerocket--aws-ecs-2-nvidia--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--bottlerocket--aws-ecs-2-nvidia--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","path":"aws-ecs-integ-bottlerocket-nvidia-ami/SsmParameterValue:--aws--service--bottlerocket--aws-ecs-2-nvidia--x86_64--latest--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-bottlerocket-nvidia-ami/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-bottlerocket-nvidia-ami/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"aws-ecs-bottlerocket-nvidia-ami":{"id":"aws-ecs-bottlerocket-nvidia-ami","path":"aws-ecs-bottlerocket-nvidia-ami","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"aws-ecs-bottlerocket-nvidia-ami/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"aws-ecs-bottlerocket-nvidia-ami/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"aws-ecs-bottlerocket-nvidia-ami/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-bottlerocket-nvidia-ami/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-bottlerocket-nvidia-ami/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/integ.cluster-imported.js.snapshot/ClusterImportedDefaultTestDeployAssert8B67C7A2.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/ClusterImportedDefaultTestDeployAssert8B67C7A2.assets.json
index 58d1a0b58ba48..00c33f7d95002 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/ClusterImportedDefaultTestDeployAssert8B67C7A2.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/ClusterImportedDefaultTestDeployAssert8B67C7A2.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "ClusterImportedDefaultTestDeployAssert8B67C7A2 Template",
"source": {
"path": "ClusterImportedDefaultTestDeployAssert8B67C7A2.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/integ-ecs-imported-cluster.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/integ-ecs-imported-cluster.assets.json
index 0c9906cbb1201..2fc929d1b8cc3 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/integ-ecs-imported-cluster.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/integ-ecs-imported-cluster.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "e56132cf60edf65ae2879e26d8df65912906d3df363d16fc86d4a530d83a07df": {
+ "874d879019294d46322d282538800cef59e5e99e568e01781a75a7ac6d75ae2b": {
+ "displayName": "integ-ecs-imported-cluster Template",
"source": {
"path": "integ-ecs-imported-cluster.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-1ce0c18d": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "e56132cf60edf65ae2879e26d8df65912906d3df363d16fc86d4a530d83a07df.json",
+ "objectKey": "874d879019294d46322d282538800cef59e5e99e568e01781a75a7ac6d75ae2b.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/integ-ecs-imported-cluster.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/integ-ecs-imported-cluster.template.json
index a399b594069ab..a5b73876d2b91 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/integ-ecs-imported-cluster.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/integ-ecs-imported-cluster.template.json
@@ -766,7 +766,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -782,7 +782,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/integ.json
index 7c4b58721d853..56283ec278854 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"ClusterImported/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "ClusterImported/DefaultTest/DeployAssert",
"assertionStackName": "ClusterImportedDefaultTestDeployAssert8B67C7A2"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/manifest.json
index 703136514bb82..d0489c7f2c621 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"integ-ecs-imported-cluster.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/e56132cf60edf65ae2879e26d8df65912906d3df363d16fc86d4a530d83a07df.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/874d879019294d46322d282538800cef59e5e99e568e01781a75a7ac6d75ae2b.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -923,51 +923,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole00371FEB3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole00371FEB3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole17E852E01": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole17E852E01",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole22C962AF2": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole22C962AF2",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole3E4846C2B": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole3E4846C2B",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole48434A97B": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole48434A97B",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "integ-ecs-imported-cluster"
@@ -1025,6 +980,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/tree.json
index 772c940a261a5..90fdb5875ac4e 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-imported.js.snapshot/tree.json
@@ -1,2032 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "integ-ecs-imported-cluster": {
- "id": "integ-ecs-imported-cluster",
- "path": "integ-ecs-imported-cluster",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "integ-ecs-imported-cluster/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-imported-cluster/Vpc/Resource",
- "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": "integ-ecs-imported-cluster/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet1/Subnet",
- "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": "integ-ecs-imported-cluster/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-imported-cluster/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-imported-cluster/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-imported-cluster/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet2/Subnet",
- "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": "integ-ecs-imported-cluster/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-imported-cluster/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-imported-cluster/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "integ-ecs-imported-cluster/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet2EIP3C605A87",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- },
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-imported-cluster/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "integ-ecs-imported-cluster/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-ecs-imported-cluster/Vpc/PrivateSubnet1/Subnet",
- "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": "integ-ecs-imported-cluster/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-ecs-imported-cluster/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-ecs-imported-cluster/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-imported-cluster/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-ecs-imported-cluster/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-ecs-imported-cluster/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "integ-ecs-imported-cluster/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-ecs-imported-cluster/Vpc/PrivateSubnet2/Subnet",
- "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": "integ-ecs-imported-cluster/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-ecs-imported-cluster/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-ecs-imported-cluster/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-imported-cluster/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-ecs-imported-cluster/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-ecs-imported-cluster/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet2NATGateway9182C01D"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "integ-ecs-imported-cluster/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-imported-cluster/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "integ-ecs-imported-cluster/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "Cluster": {
- "id": "Cluster",
- "path": "integ-ecs-imported-cluster/Cluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-imported-cluster/Cluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "Cluster": {
- "id": "Cluster",
- "path": "integ-ecs-imported-cluster/Cluster/Cluster",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::ClusterCapacityProviderAssociations",
- "aws:cdk:cloudformation:props": {
- "capacityProviders": [
- {
- "Ref": "EC2CapacityProvider5A2E35CD"
- }
- ],
- "cluster": {
- "Ref": "ClusterEB0386A7"
- },
- "defaultCapacityProviderStrategy": []
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addAsgCapacityProvider": [
- "*"
- ]
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "integ-ecs-imported-cluster/ASG",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "integ-ecs-imported-cluster/ASG/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-imported-cluster/ASG/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "integ-ecs-imported-cluster/ASG/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-imported-cluster/ASG"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "integ-ecs-imported-cluster/ASG/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "integ-ecs-imported-cluster/ASG/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-imported-cluster/ASG/InstanceRole/Resource",
- "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": "integ-ecs-imported-cluster/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "integ-ecs-imported-cluster/ASG/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-imported-cluster/ASG/InstanceRole/DefaultPolicy/Resource",
- "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": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- },
- {
- "Action": [
- "ecs:Poll",
- "ecs:StartTelemetrySession"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecr:GetAuthorizationToken",
- "ecs:DiscoverPollEndpoint",
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ASGInstanceRoleDefaultPolicy7636D8BF",
- "roles": [
- {
- "Ref": "ASGInstanceRoleE263A41B"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "integ-ecs-imported-cluster/ASG/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "ASGInstanceRoleE263A41B"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "integ-ecs-imported-cluster/ASG/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "integ-ecs-imported-cluster/ASG/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-imported-cluster/ASG/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "ASGInstanceProfile0A2834D7",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "t2.micro",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "ASGInstanceSecurityGroup0525485D",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-imported-cluster/ASG/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-imported-cluster/ASG/LaunchTemplate"
- }
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "#!/bin/bash\necho ECS_CLUSTER=",
- {
- "Ref": "ClusterEB0386A7"
- },
- " >> /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": "integ-ecs-imported-cluster/ASG/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "integ-ecs-imported-cluster/ASG/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "ASGLaunchTemplate0CA92847"
- },
- "version": {
- "Fn::GetAtt": [
- "ASGLaunchTemplate0CA92847",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "1",
- "minSize": "0",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-imported-cluster/ASG",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- },
- {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "integ-ecs-imported-cluster/ASG/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "integ-ecs-imported-cluster/ASG/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "integ-ecs-imported-cluster/ASG/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "integ-ecs-imported-cluster/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-imported-cluster/ASG/DrainECSHook/Function/ServiceRole/Resource",
- "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": "integ-ecs-imported-cluster/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "integ-ecs-imported-cluster/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-imported-cluster/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "ASG46ED3070"
- }
- ]
- ]
- }
- },
- {
- "Action": [
- "ecs:DescribeContainerInstances",
- "ecs:DescribeTasks",
- "ecs:ListTasks",
- "ecs:UpdateContainerInstancesState"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecs:ListContainerInstances",
- "ecs:SubmitContainerStateChange",
- "ecs:SubmitTaskStateChange"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27",
- "roles": [
- {
- "Ref": "ASGDrainECSHookFunctionServiceRoleC12963BB"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-imported-cluster/ASG/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": "ClusterEB0386A7"
- }
- }
- },
- "handler": "index.lambda_handler",
- "role": {
- "Fn::GetAtt": [
- "ASGDrainECSHookFunctionServiceRoleC12963BB",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-imported-cluster/ASG"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:integecsimportedclusterASGLifecycleHookDrainHookTopic78A11E12": {
- "id": "AllowInvoke:integecsimportedclusterASGLifecycleHookDrainHookTopic78A11E12",
- "path": "integ-ecs-imported-cluster/ASG/DrainECSHook/Function/AllowInvoke:integecsimportedclusterASGLifecycleHookDrainHookTopic78A11E12",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "ASGDrainECSHookFunction5F24CF4D",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "integ-ecs-imported-cluster/ASG/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-imported-cluster/ASG/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "ASGDrainECSHookFunction5F24CF4D",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "integ-ecs-imported-cluster/ASG/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "integ-ecs-imported-cluster/ASG/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-imported-cluster/ASG/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-imported-cluster/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "integ-ecs-imported-cluster/ASG/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "integ-ecs-imported-cluster/ASG/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-imported-cluster/ASG/LifecycleHookDrainHook/Role/Resource",
- "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": "integ-ecs-imported-cluster/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "integ-ecs-imported-cluster/ASG/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-imported-cluster/ASG/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57",
- "roles": [
- {
- "Ref": "ASGLifecycleHookDrainHookRoleD640316C"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-imported-cluster/ASG/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "ASG46ED3070"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "ASGLifecycleHookDrainHookRoleD640316C",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "instanceType": "*",
- "machineImage": "*",
- "minCapacity": "*"
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- },
- "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": "integ-ecs-imported-cluster/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": "integ-ecs-imported-cluster/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": []
- }
- },
- "EC2CapacityProvider": {
- "id": "EC2CapacityProvider",
- "path": "integ-ecs-imported-cluster/EC2CapacityProvider",
- "children": {
- "EC2CapacityProvider": {
- "id": "EC2CapacityProvider",
- "path": "integ-ecs-imported-cluster/EC2CapacityProvider/EC2CapacityProvider",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::CapacityProvider",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupProvider": {
- "autoScalingGroupArn": {
- "Ref": "ASG46ED3070"
- },
- "managedScaling": {
- "status": "ENABLED",
- "targetCapacity": 100
- },
- "managedTerminationProtection": "DISABLED"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCapacityProvider",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.AsgCapacityProvider",
- "version": "0.0.0"
- }
- },
- "ImportedCluster": {
- "id": "ImportedCluster",
- "path": "integ-ecs-imported-cluster/ImportedCluster",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "integ-ecs-imported-cluster/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "integ-ecs-imported-cluster/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "ClusterImported": {
- "id": "ClusterImported",
- "path": "ClusterImported",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "ClusterImported/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "ClusterImported/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "ClusterImported/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "ClusterImported/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "ClusterImported/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"integ-ecs-imported-cluster":{"id":"integ-ecs-imported-cluster","path":"integ-ecs-imported-cluster","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"integ-ecs-imported-cluster/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ecs-imported-cluster/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-imported-cluster/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ecs-imported-cluster/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"integ-ecs-imported-cluster/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"integ-ecs-imported-cluster/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ecs-imported-cluster/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-imported-cluster/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ecs-imported-cluster/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}},"EIP":{"id":"EIP","path":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"integ-ecs-imported-cluster/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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"tags":[{"key":"Name","value":"integ-ecs-imported-cluster/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ecs-imported-cluster/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-imported-cluster/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ecs-imported-cluster/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ecs-imported-cluster/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-imported-cluster/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ecs-imported-cluster/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":"VpcPublicSubnet2NATGateway9182C01D"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"integ-ecs-imported-cluster/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"Cluster":{"id":"Cluster","path":"integ-ecs-imported-cluster/Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addAsgCapacityProvider":["*"]}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-imported-cluster/Cluster/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":{}}},"Cluster":{"id":"Cluster","path":"integ-ecs-imported-cluster/Cluster/Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"Ref":"EC2CapacityProvider5A2E35CD"}],"cluster":{"Ref":"ClusterEB0386A7"},"defaultCapacityProviderStrategy":[]}}}}},"ASG":{"id":"ASG","path":"integ-ecs-imported-cluster/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","instanceType":"*","machineImage":"*","minCapacity":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"integ-ecs-imported-cluster/ASG/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-imported-cluster/ASG/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":"integ-ecs-imported-cluster/ASG/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"integ-ecs-imported-cluster/ASG"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"integ-ecs-imported-cluster/ASG/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":"integ-ecs-imported-cluster/ASG/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-imported-cluster/ASG/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":"integ-ecs-imported-cluster/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-imported-cluster/ASG/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":"integ-ecs-imported-cluster/ASG/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":["ClusterEB0386A7","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ASGInstanceRoleDefaultPolicy7636D8BF","roles":[{"Ref":"ASGInstanceRoleE263A41B"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"integ-ecs-imported-cluster/ASG/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":"ASGInstanceRoleE263A41B"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"integ-ecs-imported-cluster/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"integ-ecs-imported-cluster/ASG/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":"integ-ecs-imported-cluster/ASG/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":["ASGInstanceProfile0A2834D7","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ASGInstanceSecurityGroup0525485D","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"integ-ecs-imported-cluster/ASG/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"integ-ecs-imported-cluster/ASG/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"ClusterEB0386A7"}," >> /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":"integ-ecs-imported-cluster/ASG/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"integ-ecs-imported-cluster/ASG/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":"ASGLaunchTemplate0CA92847"},"version":{"Fn::GetAtt":["ASGLaunchTemplate0CA92847","LatestVersionNumber"]}},"maxSize":"1","minSize":"0","tags":[{"key":"Name","value":"integ-ecs-imported-cluster/ASG","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"integ-ecs-imported-cluster/ASG/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"integ-ecs-imported-cluster/ASG/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":"integ-ecs-imported-cluster/ASG/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":"integ-ecs-imported-cluster/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-imported-cluster/ASG/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":"integ-ecs-imported-cluster/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-imported-cluster/ASG/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":"integ-ecs-imported-cluster/ASG/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":"ASG46ED3070"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}],"Version":"2012-10-17"},"policyName":"ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27","roles":[{"Ref":"ASGDrainECSHookFunctionServiceRoleC12963BB"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-ecs-imported-cluster/ASG/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":"ClusterEB0386A7"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ASGDrainECSHookFunctionServiceRoleC12963BB","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"integ-ecs-imported-cluster/ASG"}],"timeout":310}}},"AllowInvoke:integecsimportedclusterASGLifecycleHookDrainHookTopic78A11E12":{"id":"AllowInvoke:integecsimportedclusterASGLifecycleHookDrainHookTopic78A11E12","path":"integ-ecs-imported-cluster/ASG/DrainECSHook/Function/AllowInvoke:integecsimportedclusterASGLifecycleHookDrainHookTopic78A11E12","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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}},"Topic":{"id":"Topic","path":"integ-ecs-imported-cluster/ASG/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":"integ-ecs-imported-cluster/ASG/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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"integ-ecs-imported-cluster/ASG/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":"integ-ecs-imported-cluster/ASG/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-imported-cluster/ASG/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":"integ-ecs-imported-cluster/ASG"}]}}}}},"Role":{"id":"Role","path":"integ-ecs-imported-cluster/ASG/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":"integ-ecs-imported-cluster/ASG/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-imported-cluster/ASG/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":"integ-ecs-imported-cluster/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-imported-cluster/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-imported-cluster/ASG/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":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}],"Version":"2012-10-17"},"policyName":"ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57","roles":[{"Ref":"ASGLifecycleHookDrainHookRoleD640316C"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-ecs-imported-cluster/ASG/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":"ASG46ED3070"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"},"roleArn":{"Fn::GetAtt":["ASGLifecycleHookDrainHookRoleD640316C","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":"integ-ecs-imported-cluster/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":"integ-ecs-imported-cluster/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":[]}},"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-ecs-imported-cluster/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.AsgCapacityProvider","version":"0.0.0"},"children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-ecs-imported-cluster/EC2CapacityProvider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCapacityProvider","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::CapacityProvider","aws:cdk:cloudformation:props":{"autoScalingGroupProvider":{"autoScalingGroupArn":{"Ref":"ASG46ED3070"},"managedScaling":{"status":"ENABLED","targetCapacity":100},"managedTerminationProtection":"DISABLED"}}}}}},"ImportedCluster":{"id":"ImportedCluster","path":"integ-ecs-imported-cluster/ImportedCluster","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"BootstrapVersion":{"id":"BootstrapVersion","path":"integ-ecs-imported-cluster/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"integ-ecs-imported-cluster/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"ClusterImported":{"id":"ClusterImported","path":"ClusterImported","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"ClusterImported/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"ClusterImported/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"ClusterImported/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"ClusterImported/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"ClusterImported/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/integ.cluster-windows-server-ami.js.snapshot/ClusterWindowsServerDefaultTestDeployAssertC6412DEB.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/ClusterWindowsServerDefaultTestDeployAssertC6412DEB.assets.json
index c2aaf2add124f..d9f384efa6982 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/ClusterWindowsServerDefaultTestDeployAssertC6412DEB.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/ClusterWindowsServerDefaultTestDeployAssertC6412DEB.assets.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
"displayName": "ClusterWindowsServerDefaultTestDeployAssertC6412DEB Template",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/cdk.out
index 3704a1b682acf..523a9aac37cbf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.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/integ.cluster-windows-server-ami.js.snapshot/integ-ecs-windows-server-ami.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/integ-ecs-windows-server-ami.assets.json
index 4651ef1bb2465..fcfa92f6baef1 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/integ-ecs-windows-server-ami.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/integ-ecs-windows-server-ami.assets.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"files": {
"a1acfc2b5f4f6b183fd2bb9863f486bc5edef6a357b355a070d9a0e502df418c": {
"displayName": "integ-ecs-windows-server-ami/Custom::VpcRestrictDefaultSGCustomResourceProvider Code",
@@ -15,16 +15,16 @@
}
}
},
- "af60c3cbe8bb23b3fa59d905cc37850248ad50abdc36cbd0d59a699447891ffe": {
+ "26cb4deda2f9874f172c2892ff9ea4ab353c08cef4a4269bb8200f0e0e83bc49": {
"displayName": "integ-ecs-windows-server-ami Template",
"source": {
"path": "integ-ecs-windows-server-ami.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region-ba8cdf1e": {
+ "current_account-current_region-cc38616e": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "af60c3cbe8bb23b3fa59d905cc37850248ad50abdc36cbd0d59a699447891ffe.json",
+ "objectKey": "26cb4deda2f9874f172c2892ff9ea4ab353c08cef4a4269bb8200f0e0e83bc49.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/integ-ecs-windows-server-ami.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/integ-ecs-windows-server-ami.template.json
index f2ec773b109a1..66a2428adecf6 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/integ-ecs-windows-server-ami.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/integ-ecs-windows-server-ami.template.json
@@ -728,7 +728,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -744,7 +744,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/integ.json
index 1ec65c1198d7b..44c241a09eff3 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"testCases": {
"ClusterWindowsServer/DefaultTest": {
"stacks": [
@@ -9,5 +9,5 @@
"assertionStackName": "ClusterWindowsServerDefaultTestDeployAssertC6412DEB"
}
},
- "minimumCliVersion": "2.1020.2"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/manifest.json
index f257ab3872e01..a331a4d979a33 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/manifest.json
@@ -18,7 +18,7 @@
"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}/af60c3cbe8bb23b3fa59d905cc37850248ad50abdc36cbd0d59a699447891ffe.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/26cb4deda2f9874f172c2892ff9ea4ab353c08cef4a4269bb8200f0e0e83bc49.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -988,57 +988,44 @@
"properties": {
"module": "aws-cdk-lib",
"flags": {
- "@aws-cdk/core:enableStackNameDuplicates": {
+ "@aws-cdk/aws-signer:signingProfileNamePassedToCfn": {
"recommendedValue": true,
- "explanation": "Allow multiple stacks with the same name"
- },
- "aws-cdk:enableDiffNoFail": {
- "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"
- },
- "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
- "recommendedValue": true,
- "explanation": "Do not specify a default DesiredCount for ECS services"
+ "explanation": "Name exports based on the construct paths relative to the stack, rather than the global construct path",
+ "unconfiguredBehavesLike": {
+ "v2": true
+ }
},
"@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,
@@ -1047,7 +1034,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,
@@ -1268,7 +1258,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,
@@ -1297,7 +1290,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,
@@ -1361,7 +1357,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,
@@ -1395,7 +1394,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,
@@ -1418,7 +1420,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,
@@ -1453,5 +1458,5 @@
}
}
},
- "minimumCliVersion": "2.1023.0"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/tree.json
index cb14826bf429f..a3e7c8b4f0a76 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster-windows-server-ami.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":{"integ-ecs-windows-server-ami":{"id":"integ-ecs-windows-server-ami","path":"integ-ecs-windows-server-ami","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"integ-ecs-windows-server-ami/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/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/17","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"integ-ecs-windows-server-ami/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ecs-windows-server-ami/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-windows-server-ami/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ecs-windows-server-ami/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"integ-ecs-windows-server-ami/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/Vpc/PublicSubnet1"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/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/17","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"integ-ecs-windows-server-ami/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ecs-windows-server-ami/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-windows-server-ami/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ecs-windows-server-ami/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"IGW":{"id":"IGW","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"integ-ecs-windows-server-ami/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"integ-ecs-windows-server-ami/Vpc/RestrictDefaultSecurityGroupCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"integ-ecs-windows-server-ami/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"integ-ecs-windows-server-ami/Custom::VpcRestrictDefaultSGCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"integ-ecs-windows-server-ami/Custom::VpcRestrictDefaultSGCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"integ-ecs-windows-server-ami/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"integ-ecs-windows-server-ami/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Cluster":{"id":"Cluster","path":"integ-ecs-windows-server-ami/Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addAsgCapacityProvider":["*"]}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/Cluster/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":{}}},"Cluster":{"id":"Cluster","path":"integ-ecs-windows-server-ami/Cluster/Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"Ref":"EC2CapacityProvider5A2E35CD"}],"cluster":{"Ref":"ClusterEB0386A7"},"defaultCapacityProviderStrategy":[]}}}}},"InstanceRole":{"id":"InstanceRole","path":"integ-ecs-windows-server-ami/InstanceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"},{"managedPolicyArn":"*"}]},{"applyRemovalPolicy":["destroy"]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportInstanceRole":{"id":"ImportInstanceRole","path":"integ-ecs-windows-server-ami/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/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"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AmazonEC2ContainerServiceForEC2Role"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/AmazonSSMManagedInstanceCore"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/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":["ClusterEB0386A7","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"InstanceRoleDefaultPolicy1531605C","roles":[{"Ref":"InstanceRole3CCE2F1D"}]}}}}}}},"ASG":{"id":"ASG","path":"integ-ecs-windows-server-ami/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","role":"*","instanceType":"*","machineImage":"*","minCapacity":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"integ-ecs-windows-server-ami/ASG/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/ASG"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"integ-ecs-windows-server-ami/ASG/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":"InstanceRole3CCE2F1D"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"integ-ecs-windows-server-ami/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/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":["ASGInstanceProfile0A2834D7","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceamiwindowslatestWindowsServer2025EnglishFullECSOptimizedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t3.small","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ASGInstanceSecurityGroup0525485D","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/ASG/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/ASG/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["Remove-Item -Recurse C:\\ProgramData\\Amazon\\ECS\\Cache\nImport-Module ECSTools\n[Environment]::SetEnvironmentVariable(\"ECS_CLUSTER\", \"",{"Ref":"ClusterEB0386A7"},"\", \"Machine\")\n[Environment]::SetEnvironmentVariable(\"ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE\", \"true\", \"Machine\")\n[Environment]::SetEnvironmentVariable(\"ECS_AVAILABLE_LOGGING_DRIVERS\", '[\"json-file\",\"awslogs\"]', \"Machine\")\n[Environment]::SetEnvironmentVariable(\"ECS_ENABLE_TASK_IAM_ROLE\", \"true\", \"Machine\")\nInitialize-ECSAgent -Cluster '",{"Ref":"ClusterEB0386A7"},"' -EnableTaskIAMRole"]]}}},"tagSpecifications":[{"resourceType":"launch-template","tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/ASG/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"integ-ecs-windows-server-ami/ASG/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":"ASGLaunchTemplate0CA92847"},"version":{"Fn::GetAtt":["ASGLaunchTemplate0CA92847","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/ASG","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"integ-ecs-windows-server-ami/ASG/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/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":"ASG46ED3070"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}],"Version":"2012-10-17"},"policyName":"ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27","roles":[{"Ref":"ASGDrainECSHookFunctionServiceRoleC12963BB"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/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('Got event without EC2InstanceId: %s', 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":"ClusterEB0386A7"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ASGDrainECSHookFunctionServiceRoleC12963BB","Arn"]},"runtime":"python3.9","tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/ASG"}],"timeout":310}}},"AllowInvoke:integecswindowsserveramiASGLifecycleHookDrainHookTopic7F7CFC5B":{"id":"AllowInvoke:integecswindowsserveramiASGLifecycleHookDrainHookTopic7F7CFC5B","path":"integ-ecs-windows-server-ami/ASG/DrainECSHook/Function/AllowInvoke:integecswindowsserveramiASGLifecycleHookDrainHookTopic7F7CFC5B","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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}},"Topic":{"id":"Topic","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG"}]}}}}},"Role":{"id":"Role","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-windows-server-ami/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/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":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}],"Version":"2012-10-17"},"policyName":"ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57","roles":[{"Ref":"ASGLifecycleHookDrainHookRoleD640316C"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/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":"ASG46ED3070"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"},"roleArn":{"Fn::GetAtt":["ASGLifecycleHookDrainHookRoleD640316C","Arn"]}}}}}}}},"SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2025-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2025-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","path":"integ-ecs-windows-server-ami/SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2025-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2025-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2025-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","path":"integ-ecs-windows-server-ami/SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2025-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-ecs-windows-server-ami/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.AsgCapacityProvider","version":"0.0.0"},"children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-ecs-windows-server-ami/EC2CapacityProvider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCapacityProvider","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::CapacityProvider","aws:cdk:cloudformation:props":{"autoScalingGroupProvider":{"autoScalingGroupArn":{"Ref":"ASG46ED3070"},"managedScaling":{"status":"ENABLED","targetCapacity":100},"managedTerminationProtection":"DISABLED"}}}}}},"TaskDef":{"id":"TaskDef","path":"integ-ecs-windows-server-ami/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"integ-ecs-windows-server-ami/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"integ-ecs-windows-server-ami/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/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":"hello-world","memory":256,"name":"main"}],"family":"integecswindowsserveramiTaskDef7E874ECF","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"main":{"id":"main","path":"integ-ecs-windows-server-ami/TaskDef/main","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"EC2Service":{"id":"EC2Service","path":"integ-ecs-windows-server-ami/EC2Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"integ-ecs-windows-server-ami/EC2Service/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":"ClusterEB0386A7"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"launchType":"EC2","schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"integ-ecs-windows-server-ami/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"integ-ecs-windows-server-ami/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"ClusterWindowsServer":{"id":"ClusterWindowsServer","path":"ClusterWindowsServer","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"ClusterWindowsServer/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"ClusterWindowsServer/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"ClusterWindowsServer/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"ClusterWindowsServer/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"ClusterWindowsServer/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
+{"version":"tree-0.1","tree":{"id":"App","path":"","constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.0.0"},"children":{"integ-ecs-windows-server-ami":{"id":"integ-ecs-windows-server-ami","path":"integ-ecs-windows-server-ami","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"integ-ecs-windows-server-ami/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/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/17","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"integ-ecs-windows-server-ami/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ecs-windows-server-ami/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-windows-server-ami/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ecs-windows-server-ami/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"integ-ecs-windows-server-ami/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/Vpc/PublicSubnet1"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/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/17","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"integ-ecs-windows-server-ami/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ecs-windows-server-ami/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-windows-server-ami/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ecs-windows-server-ami/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"IGW":{"id":"IGW","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"integ-ecs-windows-server-ami/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"integ-ecs-windows-server-ami/Vpc/RestrictDefaultSecurityGroupCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"integ-ecs-windows-server-ami/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"integ-ecs-windows-server-ami/Custom::VpcRestrictDefaultSGCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"integ-ecs-windows-server-ami/Custom::VpcRestrictDefaultSGCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"integ-ecs-windows-server-ami/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"integ-ecs-windows-server-ami/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Cluster":{"id":"Cluster","path":"integ-ecs-windows-server-ami/Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addAsgCapacityProvider":["*"]}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/Cluster/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":{}}},"Cluster":{"id":"Cluster","path":"integ-ecs-windows-server-ami/Cluster/Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"Ref":"EC2CapacityProvider5A2E35CD"}],"cluster":{"Ref":"ClusterEB0386A7"},"defaultCapacityProviderStrategy":[]}}}}},"InstanceRole":{"id":"InstanceRole","path":"integ-ecs-windows-server-ami/InstanceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"},{"managedPolicyArn":"*"}]},{"applyRemovalPolicy":["destroy"]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportInstanceRole":{"id":"ImportInstanceRole","path":"integ-ecs-windows-server-ami/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/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"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AmazonEC2ContainerServiceForEC2Role"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/AmazonSSMManagedInstanceCore"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/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":["ClusterEB0386A7","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"InstanceRoleDefaultPolicy1531605C","roles":[{"Ref":"InstanceRole3CCE2F1D"}]}}}}}}},"ASG":{"id":"ASG","path":"integ-ecs-windows-server-ami/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","role":"*","instanceType":"*","machineImage":"*","minCapacity":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"integ-ecs-windows-server-ami/ASG/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/ASG"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"integ-ecs-windows-server-ami/ASG/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":"InstanceRole3CCE2F1D"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"integ-ecs-windows-server-ami/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/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":["ASGInstanceProfile0A2834D7","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceamiwindowslatestWindowsServer2025EnglishFullECSOptimizedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t3.small","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ASGInstanceSecurityGroup0525485D","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/ASG/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/ASG/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["Remove-Item -Recurse C:\\ProgramData\\Amazon\\ECS\\Cache\nImport-Module ECSTools\n[Environment]::SetEnvironmentVariable(\"ECS_CLUSTER\", \"",{"Ref":"ClusterEB0386A7"},"\", \"Machine\")\n[Environment]::SetEnvironmentVariable(\"ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE\", \"true\", \"Machine\")\n[Environment]::SetEnvironmentVariable(\"ECS_AVAILABLE_LOGGING_DRIVERS\", '[\"json-file\",\"awslogs\"]', \"Machine\")\n[Environment]::SetEnvironmentVariable(\"ECS_ENABLE_TASK_IAM_ROLE\", \"true\", \"Machine\")\nInitialize-ECSAgent -Cluster '",{"Ref":"ClusterEB0386A7"},"' -EnableTaskIAMRole"]]}}},"tagSpecifications":[{"resourceType":"launch-template","tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/ASG/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"integ-ecs-windows-server-ami/ASG/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":"ASGLaunchTemplate0CA92847"},"version":{"Fn::GetAtt":["ASGLaunchTemplate0CA92847","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/ASG","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"integ-ecs-windows-server-ami/ASG/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/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":"ASG46ED3070"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}],"Version":"2012-10-17"},"policyName":"ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27","roles":[{"Ref":"ASGDrainECSHookFunctionServiceRoleC12963BB"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/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":"ClusterEB0386A7"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ASGDrainECSHookFunctionServiceRoleC12963BB","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/ASG"}],"timeout":310}}},"AllowInvoke:integecswindowsserveramiASGLifecycleHookDrainHookTopic7F7CFC5B":{"id":"AllowInvoke:integecswindowsserveramiASGLifecycleHookDrainHookTopic7F7CFC5B","path":"integ-ecs-windows-server-ami/ASG/DrainECSHook/Function/AllowInvoke:integecswindowsserveramiASGLifecycleHookDrainHookTopic7F7CFC5B","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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}},"Topic":{"id":"Topic","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG"}]}}}}},"Role":{"id":"Role","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/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":"integ-ecs-windows-server-ami/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-windows-server-ami/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/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":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}],"Version":"2012-10-17"},"policyName":"ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57","roles":[{"Ref":"ASGLifecycleHookDrainHookRoleD640316C"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/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":"ASG46ED3070"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"},"roleArn":{"Fn::GetAtt":["ASGLifecycleHookDrainHookRoleD640316C","Arn"]}}}}}}}},"SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2025-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2025-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","path":"integ-ecs-windows-server-ami/SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2025-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2025-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2025-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","path":"integ-ecs-windows-server-ami/SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2025-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-ecs-windows-server-ami/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.AsgCapacityProvider","version":"0.0.0"},"children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-ecs-windows-server-ami/EC2CapacityProvider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCapacityProvider","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::CapacityProvider","aws:cdk:cloudformation:props":{"autoScalingGroupProvider":{"autoScalingGroupArn":{"Ref":"ASG46ED3070"},"managedScaling":{"status":"ENABLED","targetCapacity":100},"managedTerminationProtection":"DISABLED"}}}}}},"TaskDef":{"id":"TaskDef","path":"integ-ecs-windows-server-ami/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"integ-ecs-windows-server-ami/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"integ-ecs-windows-server-ami/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/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":"hello-world","memory":256,"name":"main"}],"family":"integecswindowsserveramiTaskDef7E874ECF","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"main":{"id":"main","path":"integ-ecs-windows-server-ami/TaskDef/main","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"EC2Service":{"id":"EC2Service","path":"integ-ecs-windows-server-ami/EC2Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"integ-ecs-windows-server-ami/EC2Service/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":"ClusterEB0386A7"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"launchType":"EC2","schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"integ-ecs-windows-server-ami/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"integ-ecs-windows-server-ami/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"ClusterWindowsServer":{"id":"ClusterWindowsServer","path":"ClusterWindowsServer","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"ClusterWindowsServer/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"ClusterWindowsServer/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"ClusterWindowsServer/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"ClusterWindowsServer/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"ClusterWindowsServer/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/integ.cluster.amazonlinux2023-ami.js.snapshot/ClusterAL2023DefaultTestDeployAssert19111415.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/ClusterAL2023DefaultTestDeployAssert19111415.assets.json
index 30c2d7aa9fbd2..c5c1511943747 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/ClusterAL2023DefaultTestDeployAssert19111415.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/ClusterAL2023DefaultTestDeployAssert19111415.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "ClusterAL2023DefaultTestDeployAssert19111415 Template",
"source": {
"path": "ClusterAL2023DefaultTestDeployAssert19111415.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/integ-ecs-al2023-ami.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/integ-ecs-al2023-ami.assets.json
index aca2aa67146da..c82f55542b085 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/integ-ecs-al2023-ami.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/integ-ecs-al2023-ami.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "f875639342074982d90d3f026dd2a665ec32849787c8c2fee81f9a8dd2f1f58d": {
+ "6c00532294f6644673f200f9cd0a87595abb762306a183f47597518cbdbe0f35": {
+ "displayName": "integ-ecs-al2023-ami Template",
"source": {
"path": "integ-ecs-al2023-ami.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-fa7b193d": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "f875639342074982d90d3f026dd2a665ec32849787c8c2fee81f9a8dd2f1f58d.json",
+ "objectKey": "6c00532294f6644673f200f9cd0a87595abb762306a183f47597518cbdbe0f35.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/integ-ecs-al2023-ami.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/integ-ecs-al2023-ami.template.json
index 13f9ef83aa094..fae28ddcb5732 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/integ-ecs-al2023-ami.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/integ-ecs-al2023-ami.template.json
@@ -628,7 +628,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -644,7 +644,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/integ.json
index 5bc611872c2c9..675b3b3ef4a15 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"ClusterAL2023/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "ClusterAL2023/DefaultTest/DeployAssert",
"assertionStackName": "ClusterAL2023DefaultTestDeployAssert19111415"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/manifest.json
index 30bac354312d0..2019bba95e4c2 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"integ-ecs-al2023-ami.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/f875639342074982d90d3f026dd2a665ec32849787c8c2fee81f9a8dd2f1f58d.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/6c00532294f6644673f200f9cd0a87595abb762306a183f47597518cbdbe0f35.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -847,51 +847,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole00371FEB3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole00371FEB3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole17E852E01": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole17E852E01",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole22C962AF2": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole22C962AF2",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole3E4846C2B": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole3E4846C2B",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole48434A97B": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole48434A97B",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "integ-ecs-al2023-ami"
@@ -949,6 +904,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": true,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1022.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/tree.json
index 09a838d62298e..dce8153700b7d 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/integ.cluster.amazonlinux2023-ami.js.snapshot/tree.json
@@ -1,1761 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "integ-ecs-al2023-ami": {
- "id": "integ-ecs-al2023-ami",
- "path": "integ-ecs-al2023-ami",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "integ-ecs-al2023-ami/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-al2023-ami/Vpc/Resource",
- "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": "integ-ecs-al2023-ami/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "integ-ecs-al2023-ami/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-ecs-al2023-ami/Vpc/PublicSubnet1/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 0,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.0.0/17",
- "mapPublicIpOnLaunch": true,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "Public"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Public"
- },
- {
- "key": "Name",
- "value": "integ-ecs-al2023-ami/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-ecs-al2023-ami/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-ecs-al2023-ami/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-al2023-ami/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-ecs-al2023-ami/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-ecs-al2023-ami/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "integ-ecs-al2023-ami/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-al2023-ami/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "integ-ecs-al2023-ami/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-al2023-ami/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "integ-ecs-al2023-ami/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "integ-ecs-al2023-ami/Vpc/PrivateSubnet1/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 0,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.128.0/17",
- "mapPublicIpOnLaunch": false,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "Private"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Private"
- },
- {
- "key": "Name",
- "value": "integ-ecs-al2023-ami/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "integ-ecs-al2023-ami/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "integ-ecs-al2023-ami/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-al2023-ami/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "integ-ecs-al2023-ami/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "integ-ecs-al2023-ami/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "integ-ecs-al2023-ami/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-al2023-ami/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "integ-ecs-al2023-ami/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "Cluster": {
- "id": "Cluster",
- "path": "integ-ecs-al2023-ami/Cluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-al2023-ami/Cluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "Cluster": {
- "id": "Cluster",
- "path": "integ-ecs-al2023-ami/Cluster/Cluster",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::ClusterCapacityProviderAssociations",
- "aws:cdk:cloudformation:props": {
- "capacityProviders": [
- {
- "Ref": "EC2CapacityProvider5A2E35CD"
- }
- ],
- "cluster": {
- "Ref": "ClusterEB0386A7"
- },
- "defaultCapacityProviderStrategy": []
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addAsgCapacityProvider": [
- "*"
- ]
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "integ-ecs-al2023-ami/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "integ-ecs-al2023-ami/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-al2023-ami/InstanceRole/Resource",
- "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"
- },
- "managedPolicyArns": [
- {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":iam::aws:policy/service-role/AmazonEC2ContainerServiceForEC2Role"
- ]
- ]
- },
- {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":iam::aws:policy/AmazonSSMManagedInstanceCore"
- ]
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "integ-ecs-al2023-ami/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-al2023-ami/InstanceRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "cloudformation:SignalResource",
- "Effect": "Allow",
- "Resource": {
- "Ref": "AWS::StackId"
- }
- },
- {
- "Action": [
- "ecs:DeregisterContainerInstance",
- "ecs:RegisterContainerInstance",
- "ecs:Submit*"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- },
- {
- "Action": [
- "ecs:Poll",
- "ecs:StartTelemetrySession"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecr:GetAuthorizationToken",
- "ecs:DiscoverPollEndpoint",
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "InstanceRoleDefaultPolicy1531605C",
- "roles": [
- {
- "Ref": "InstanceRole3CCE2F1D"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- },
- "managedPolicies": [
- {
- "managedPolicyArn": "*"
- },
- {
- "managedPolicyArn": "*"
- }
- ]
- },
- {
- "applyRemovalPolicy": [
- "destroy"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "integ-ecs-al2023-ami/ASG",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "integ-ecs-al2023-ami/ASG/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-al2023-ami/ASG/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "integ-ecs-al2023-ami/ASG/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-al2023-ami/ASG"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "integ-ecs-al2023-ami/ASG/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "InstanceRole3CCE2F1D"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "integ-ecs-al2023-ami/ASG/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "integ-ecs-al2023-ami/ASG/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-al2023-ami/ASG/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "ASGInstanceProfile0A2834D7",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2023recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "t2.micro",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "ASGInstanceSecurityGroup0525485D",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-al2023-ami/ASG/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-al2023-ami/ASG/LaunchTemplate"
- }
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "#!/bin/bash\nset -x\nset -e\necho ECS_CLUSTER=",
- {
- "Ref": "ClusterEB0386A7"
- },
- " >> /etc/ecs/ecs.config\nsudo yum install -y iptables-services; sudo iptables --insert DOCKER-USER 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP\nsudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables\necho ECS_AWSVPC_BLOCK_IMDS=true >> /etc/ecs/ecs.config\nyum install -y aws-cfn-bootstrap\n/opt/aws/bin/cfn-signal -e $? --stack ",
- {
- "Ref": "AWS::StackId"
- },
- " --resource ASG46ED3070 --region ",
- {
- "Ref": "AWS::Region"
- }
- ]
- ]
- }
- }
- },
- "tagSpecifications": [
- {
- "resourceType": "launch-template",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-al2023-ami/ASG/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "integ-ecs-al2023-ami/ASG/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "ASGLaunchTemplate0CA92847"
- },
- "version": {
- "Fn::GetAtt": [
- "ASGLaunchTemplate0CA92847",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "1",
- "minSize": "1",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-al2023-ami/ASG",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "integ-ecs-al2023-ami/ASG/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "integ-ecs-al2023-ami/ASG/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "integ-ecs-al2023-ami/ASG/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "integ-ecs-al2023-ami/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-al2023-ami/ASG/DrainECSHook/Function/ServiceRole/Resource",
- "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": "integ-ecs-al2023-ami/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "integ-ecs-al2023-ami/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-al2023-ami/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "ASG46ED3070"
- }
- ]
- ]
- }
- },
- {
- "Action": [
- "ecs:DescribeContainerInstances",
- "ecs:DescribeTasks",
- "ecs:ListTasks",
- "ecs:UpdateContainerInstancesState"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecs:ListContainerInstances",
- "ecs:SubmitContainerStateChange",
- "ecs:SubmitTaskStateChange"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "ClusterEB0386A7",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27",
- "roles": [
- {
- "Ref": "ASGDrainECSHookFunctionServiceRoleC12963BB"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-al2023-ami/ASG/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": "ClusterEB0386A7"
- }
- }
- },
- "handler": "index.lambda_handler",
- "role": {
- "Fn::GetAtt": [
- "ASGDrainECSHookFunctionServiceRoleC12963BB",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-al2023-ami/ASG"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:integecsal2023amiASGLifecycleHookDrainHookTopic083F299F": {
- "id": "AllowInvoke:integecsal2023amiASGLifecycleHookDrainHookTopic083F299F",
- "path": "integ-ecs-al2023-ami/ASG/DrainECSHook/Function/AllowInvoke:integecsal2023amiASGLifecycleHookDrainHookTopic083F299F",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "ASGDrainECSHookFunction5F24CF4D",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "integ-ecs-al2023-ami/ASG/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-al2023-ami/ASG/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "ASGDrainECSHookFunction5F24CF4D",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "integ-ecs-al2023-ami/ASG/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "integ-ecs-al2023-ami/ASG/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-al2023-ami/ASG/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "integ-ecs-al2023-ami/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "integ-ecs-al2023-ami/ASG/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "integ-ecs-al2023-ami/ASG/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-al2023-ami/ASG/LifecycleHookDrainHook/Role/Resource",
- "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": "integ-ecs-al2023-ami/ASG"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "integ-ecs-al2023-ami/ASG/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-al2023-ami/ASG/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57",
- "roles": [
- {
- "Ref": "ASGLifecycleHookDrainHookRoleD640316C"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "integ-ecs-al2023-ami/ASG/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "ASG46ED3070"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "ASGLifecycleHookDrainHookTopicA8AD4ACB"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "ASGLifecycleHookDrainHookRoleD640316C",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "role": "*",
- "userData": "*",
- "instanceType": "*",
- "machineImage": "*",
- "minCapacity": "*",
- "signals": "*"
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- }
- ]
- }
- },
- "SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": {
- "id": "SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter",
- "path": "integ-ecs-al2023-ami/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--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-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118": {
- "id": "SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
- "path": "integ-ecs-al2023-ami/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "EC2CapacityProvider": {
- "id": "EC2CapacityProvider",
- "path": "integ-ecs-al2023-ami/EC2CapacityProvider",
- "children": {
- "EC2CapacityProvider": {
- "id": "EC2CapacityProvider",
- "path": "integ-ecs-al2023-ami/EC2CapacityProvider/EC2CapacityProvider",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::CapacityProvider",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupProvider": {
- "autoScalingGroupArn": {
- "Ref": "ASG46ED3070"
- },
- "managedScaling": {
- "status": "ENABLED",
- "targetCapacity": 100
- },
- "managedTerminationProtection": "DISABLED"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCapacityProvider",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.AsgCapacityProvider",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "integ-ecs-al2023-ami/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "integ-ecs-al2023-ami/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "ClusterAL2023": {
- "id": "ClusterAL2023",
- "path": "ClusterAL2023",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "ClusterAL2023/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "ClusterAL2023/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "ClusterAL2023/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "ClusterAL2023/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "ClusterAL2023/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"integ-ecs-al2023-ami":{"id":"integ-ecs-al2023-ami","path":"integ-ecs-al2023-ami","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"integ-ecs-al2023-ami/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-al2023-ami/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":"integ-ecs-al2023-ami/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"integ-ecs-al2023-ami/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":"integ-ecs-al2023-ami/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/17","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"integ-ecs-al2023-ami/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ecs-al2023-ami/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ecs-al2023-ami/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":"integ-ecs-al2023-ami/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-al2023-ami/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ecs-al2023-ami/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"integ-ecs-al2023-ami/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":"integ-ecs-al2023-ami/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"integ-ecs-al2023-ami/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"integ-ecs-al2023-ami/Vpc/PublicSubnet1"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"integ-ecs-al2023-ami/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":"integ-ecs-al2023-ami/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/17","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"integ-ecs-al2023-ami/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"integ-ecs-al2023-ami/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"integ-ecs-al2023-ami/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":"integ-ecs-al2023-ami/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-al2023-ami/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"integ-ecs-al2023-ami/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"IGW":{"id":"IGW","path":"integ-ecs-al2023-ami/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":"integ-ecs-al2023-ami/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"integ-ecs-al2023-ami/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"Cluster":{"id":"Cluster","path":"integ-ecs-al2023-ami/Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addAsgCapacityProvider":["*"]}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-al2023-ami/Cluster/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":{}}},"Cluster":{"id":"Cluster","path":"integ-ecs-al2023-ami/Cluster/Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"Ref":"EC2CapacityProvider5A2E35CD"}],"cluster":{"Ref":"ClusterEB0386A7"},"defaultCapacityProviderStrategy":[]}}}}},"InstanceRole":{"id":"InstanceRole","path":"integ-ecs-al2023-ami/InstanceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"},{"managedPolicyArn":"*"}]},{"applyRemovalPolicy":["destroy"]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportInstanceRole":{"id":"ImportInstanceRole","path":"integ-ecs-al2023-ami/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-al2023-ami/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"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AmazonEC2ContainerServiceForEC2Role"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/AmazonSSMManagedInstanceCore"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-al2023-ami/InstanceRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-al2023-ami/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":"cloudformation:SignalResource","Effect":"Allow","Resource":{"Ref":"AWS::StackId"}},{"Action":["ecs:DeregisterContainerInstance","ecs:RegisterContainerInstance","ecs:Submit*"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"InstanceRoleDefaultPolicy1531605C","roles":[{"Ref":"InstanceRole3CCE2F1D"}]}}}}}}},"ASG":{"id":"ASG","path":"integ-ecs-al2023-ami/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","role":"*","userData":"*","instanceType":"*","machineImage":"*","minCapacity":"*","signals":"*"},{"addToRolePolicy":[{}]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addUserData":["*"]},{"addUserData":["*"]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"integ-ecs-al2023-ami/ASG/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-al2023-ami/ASG/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":"integ-ecs-al2023-ami/ASG/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"integ-ecs-al2023-ami/ASG"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"integ-ecs-al2023-ami/ASG/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":"InstanceRole3CCE2F1D"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"integ-ecs-al2023-ami/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"integ-ecs-al2023-ami/ASG/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":"integ-ecs-al2023-ami/ASG/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":["ASGInstanceProfile0A2834D7","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2023recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ASGInstanceSecurityGroup0525485D","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"integ-ecs-al2023-ami/ASG/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"integ-ecs-al2023-ami/ASG/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\nset -x\nset -e\necho ECS_CLUSTER=",{"Ref":"ClusterEB0386A7"}," >> /etc/ecs/ecs.config\nsudo yum install -y iptables-services; sudo iptables --insert DOCKER-USER 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP\nsudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables\necho ECS_AWSVPC_BLOCK_IMDS=true >> /etc/ecs/ecs.config\nyum install -y aws-cfn-bootstrap\n/opt/aws/bin/cfn-signal -e $? --stack ",{"Ref":"AWS::StackId"}," --resource ASG46ED3070 --region ",{"Ref":"AWS::Region"}]]}}},"tagSpecifications":[{"resourceType":"launch-template","tags":[{"key":"Name","value":"integ-ecs-al2023-ami/ASG/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"integ-ecs-al2023-ami/ASG/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":"ASGLaunchTemplate0CA92847"},"version":{"Fn::GetAtt":["ASGLaunchTemplate0CA92847","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"integ-ecs-al2023-ami/ASG","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"integ-ecs-al2023-ami/ASG/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"integ-ecs-al2023-ami/ASG/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":"integ-ecs-al2023-ami/ASG/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":"integ-ecs-al2023-ami/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-al2023-ami/ASG/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":"integ-ecs-al2023-ami/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-al2023-ami/ASG/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":"integ-ecs-al2023-ami/ASG/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":"ASG46ED3070"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}],"Version":"2012-10-17"},"policyName":"ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27","roles":[{"Ref":"ASGDrainECSHookFunctionServiceRoleC12963BB"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-ecs-al2023-ami/ASG/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":"ClusterEB0386A7"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ASGDrainECSHookFunctionServiceRoleC12963BB","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"integ-ecs-al2023-ami/ASG"}],"timeout":310}}},"AllowInvoke:integecsal2023amiASGLifecycleHookDrainHookTopic083F299F":{"id":"AllowInvoke:integecsal2023amiASGLifecycleHookDrainHookTopic083F299F","path":"integ-ecs-al2023-ami/ASG/DrainECSHook/Function/AllowInvoke:integecsal2023amiASGLifecycleHookDrainHookTopic083F299F","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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}},"Topic":{"id":"Topic","path":"integ-ecs-al2023-ami/ASG/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":"integ-ecs-al2023-ami/ASG/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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"integ-ecs-al2023-ami/ASG/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":"integ-ecs-al2023-ami/ASG/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-al2023-ami/ASG/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":"integ-ecs-al2023-ami/ASG"}]}}}}},"Role":{"id":"Role","path":"integ-ecs-al2023-ami/ASG/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":"integ-ecs-al2023-ami/ASG/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"integ-ecs-al2023-ami/ASG/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":"integ-ecs-al2023-ami/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-al2023-ami/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"integ-ecs-al2023-ami/ASG/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":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}],"Version":"2012-10-17"},"policyName":"ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57","roles":[{"Ref":"ASGLifecycleHookDrainHookRoleD640316C"}]}}}}}}},"Resource":{"id":"Resource","path":"integ-ecs-al2023-ami/ASG/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":"ASG46ED3070"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"},"roleArn":{"Fn::GetAtt":["ASGLifecycleHookDrainHookRoleD640316C","Arn"]}}}}}}}},"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","path":"integ-ecs-al2023-ami/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--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-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","path":"integ-ecs-al2023-ami/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-ecs-al2023-ami/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.AsgCapacityProvider","version":"0.0.0"},"children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-ecs-al2023-ami/EC2CapacityProvider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCapacityProvider","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::CapacityProvider","aws:cdk:cloudformation:props":{"autoScalingGroupProvider":{"autoScalingGroupArn":{"Ref":"ASG46ED3070"},"managedScaling":{"status":"ENABLED","targetCapacity":100},"managedTerminationProtection":"DISABLED"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"integ-ecs-al2023-ami/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"integ-ecs-al2023-ami/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"ClusterAL2023":{"id":"ClusterAL2023","path":"ClusterAL2023","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"ClusterAL2023/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"ClusterAL2023/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"ClusterAL2023/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"ClusterAL2023/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"ClusterAL2023/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/log-drivers/integ.fluentd-driver.js.snapshot/cdk-ecs-fluentd.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/cdk-ecs-fluentd.assets.json
index 70594cac19dc0..635ba6ad1ea68 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/cdk-ecs-fluentd.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/cdk-ecs-fluentd.assets.json
@@ -1,16 +1,16 @@
{
- "version": "41.0.0",
+ "version": "45.0.0",
"files": {
- "e4175e4d4e137376260401fe8b1f168da299f6adc7a81843f78544793a6bdf0e": {
+ "5377c2126468273666a595a2007b1bf64f47b94d0a22fedb7ccbd4957abbd8d9": {
"displayName": "cdk-ecs-fluentd Template",
"source": {
"path": "cdk-ecs-fluentd.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-f89877c8": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "e4175e4d4e137376260401fe8b1f168da299f6adc7a81843f78544793a6bdf0e.json",
+ "objectKey": "5377c2126468273666a595a2007b1bf64f47b94d0a22fedb7ccbd4957abbd8d9.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/cdk-ecs-fluentd.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/cdk-ecs-fluentd.template.json
index b505c82abacc6..397a31d3ac201 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/cdk-ecs-fluentd.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/cdk-ecs-fluentd.template.json
@@ -608,7 +608,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -624,7 +624,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/cdk.out
index 188478b55560e..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"41.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/cdkecsfluentdtestDefaultTestDeployAssert52981939.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/cdkecsfluentdtestDefaultTestDeployAssert52981939.assets.json
index 4c8729cab139d..a2e5d43503dff 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/cdkecsfluentdtestDefaultTestDeployAssert52981939.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/cdkecsfluentdtestDefaultTestDeployAssert52981939.assets.json
@@ -1,5 +1,5 @@
{
- "version": "41.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
"displayName": "cdkecsfluentdtestDefaultTestDeployAssert52981939 Template",
@@ -8,7 +8,7 @@
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/integ.json
index 70a02c71c70c6..88bdca0d66c23 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "41.0.0",
+ "version": "45.0.0",
"testCases": {
"cdk-ecs-fluentd-test/DefaultTest": {
"stacks": [
@@ -9,5 +9,5 @@
"assertionStackName": "cdkecsfluentdtestDefaultTestDeployAssert52981939"
}
},
- "minimumCliVersion": "2.1005.0"
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/manifest.json
index bf1b5c57e88bd..bed08edaabd19 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "43.0.0",
+ "version": "48.0.0",
"artifacts": {
"cdk-ecs-fluentd.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/e4175e4d4e137376260401fe8b1f168da299f6adc7a81843f78544793a6bdf0e.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/5377c2126468273666a595a2007b1bf64f47b94d0a22fedb7ccbd4957abbd8d9.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -845,51 +845,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole00371FEB3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole00371FEB3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole17E852E01": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole17E852E01",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole22C962AF2": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole22C962AF2",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole3E4846C2B": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole3E4846C2B",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole48434A97B": [
- {
- "type": "aws:cdk:logicalId",
- "data": "ASGDrainECSHookFunctioninlinePolicyAddedToExecutionRole48434A97B",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "cdk-ecs-fluentd"
@@ -947,7 +902,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
},
- "minimumCliVersion": "2.1013.0"
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/tree.json
index fbd7c73658df1..db363040b634a 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/log-drivers/integ.fluentd-driver.js.snapshot/tree.json
@@ -1 +1 @@
-{"version":"tree-0.1","tree":{"id":"App","path":"","children":{"cdk-ecs-fluentd":{"id":"cdk-ecs-fluentd","path":"cdk-ecs-fluentd","children":{"Vpc":{"id":"Vpc","path":"cdk-ecs-fluentd/Vpc","children":{"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/Vpc/Resource","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":"cdk-ecs-fluentd/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPC","version":"0.0.0"}},"PublicSubnet1":{"id":"PublicSubnet1","path":"cdk-ecs-fluentd/Vpc/PublicSubnet1","children":{"Subnet":{"id":"Subnet","path":"cdk-ecs-fluentd/Vpc/PublicSubnet1/Subnet","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[0,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.0.0/17","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"cdk-ecs-fluentd/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"Acl":{"id":"Acl","path":"cdk-ecs-fluentd/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"cdk-ecs-fluentd/Vpc/PublicSubnet1/RouteTable","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"cdk-ecs-fluentd/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"cdk-ecs-fluentd/Vpc/PublicSubnet1/RouteTableAssociation","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"}},"DefaultRoute":{"id":"DefaultRoute","path":"cdk-ecs-fluentd/Vpc/PublicSubnet1/DefaultRoute","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","gatewayId":{"Ref":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"}},"EIP":{"id":"EIP","path":"cdk-ecs-fluentd/Vpc/PublicSubnet1/EIP","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::EIP","aws:cdk:cloudformation:props":{"domain":"vpc","tags":[{"key":"Name","value":"cdk-ecs-fluentd/Vpc/PublicSubnet1"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"}},"NATGateway":{"id":"NATGateway","path":"cdk-ecs-fluentd/Vpc/PublicSubnet1/NATGateway","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::NatGateway","aws:cdk:cloudformation:props":{"allocationId":{"Fn::GetAtt":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"cdk-ecs-fluentd/Vpc/PublicSubnet1"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnNatGateway","version":"0.0.0"}}},"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":["*"]}]}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"cdk-ecs-fluentd/Vpc/PrivateSubnet1","children":{"Subnet":{"id":"Subnet","path":"cdk-ecs-fluentd/Vpc/PrivateSubnet1/Subnet","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[0,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.128.0/17","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"cdk-ecs-fluentd/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"Acl":{"id":"Acl","path":"cdk-ecs-fluentd/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"cdk-ecs-fluentd/Vpc/PrivateSubnet1/RouteTable","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"cdk-ecs-fluentd/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"cdk-ecs-fluentd/Vpc/PrivateSubnet1/RouteTableAssociation","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"}},"DefaultRoute":{"id":"DefaultRoute","path":"cdk-ecs-fluentd/Vpc/PrivateSubnet1/DefaultRoute","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","natGatewayId":{"Ref":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"}}},"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":"*"},{}]}},"IGW":{"id":"IGW","path":"cdk-ecs-fluentd/Vpc/IGW","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::InternetGateway","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"cdk-ecs-fluentd/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnInternetGateway","version":"0.0.0"}},"VPCGW":{"id":"VPCGW","path":"cdk-ecs-fluentd/Vpc/VPCGW","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPCGatewayAttachment","aws:cdk:cloudformation:props":{"internetGatewayId":{"Ref":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]}},"Cluster":{"id":"Cluster","path":"cdk-ecs-fluentd/Cluster","children":{"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/Cluster/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::Cluster","aws:cdk:cloudformation:props":{}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCluster","version":"0.0.0"}},"Cluster":{"id":"Cluster","path":"cdk-ecs-fluentd/Cluster/Cluster","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"Ref":"EC2CapacityProvider5A2E35CD"}],"cluster":{"Ref":"ClusterEB0386A7"},"defaultCapacityProviderStrategy":[]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addAsgCapacityProvider":["*"]}]}},"InstanceRole":{"id":"InstanceRole","path":"cdk-ecs-fluentd/InstanceRole","children":{"ImportInstanceRole":{"id":"ImportInstanceRole","path":"cdk-ecs-fluentd/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/InstanceRole/Resource","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"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AmazonEC2ContainerServiceForEC2Role"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/AmazonSSMManagedInstanceCore"]]}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"cdk-ecs-fluentd/InstanceRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/InstanceRole/DefaultPolicy/Resource","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":["ClusterEB0386A7","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"InstanceRoleDefaultPolicy1531605C","roles":[{"Ref":"InstanceRole3CCE2F1D"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"},{"managedPolicyArn":"*"}]},{"applyRemovalPolicy":["destroy"]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]}},"ASG":{"id":"ASG","path":"cdk-ecs-fluentd/ASG","children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"cdk-ecs-fluentd/ASG/InstanceSecurityGroup","children":{"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/InstanceSecurityGroup/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroup","aws:cdk:cloudformation:props":{"groupDescription":"cdk-ecs-fluentd/ASG/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"cdk-ecs-fluentd/ASG"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroup","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]}},"InstanceProfile":{"id":"InstanceProfile","path":"cdk-ecs-fluentd/ASG/InstanceProfile","attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::InstanceProfile","aws:cdk:cloudformation:props":{"roles":[{"Ref":"InstanceRole3CCE2F1D"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnInstanceProfile","version":"0.0.0"}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"cdk-ecs-fluentd/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"cdk-ecs-fluentd/ASG/LaunchTemplate","children":{"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/LaunchTemplate/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::LaunchTemplate","aws:cdk:cloudformation:props":{"launchTemplateData":{"iamInstanceProfile":{"arn":{"Fn::GetAtt":["ASGInstanceProfile0A2834D7","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2023recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ASGInstanceSecurityGroup0525485D","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"cdk-ecs-fluentd/ASG/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"cdk-ecs-fluentd/ASG/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\nset -xe\ncurl -fsSL https://toolbelt.treasuredata.com/sh/install-amazon2023-fluent-package5-lts.sh | sh\nsudo systemctl start fluentd\necho ECS_CLUSTER=",{"Ref":"ClusterEB0386A7"}," >> /etc/ecs/ecs.config"]]}}},"tagSpecifications":[{"resourceType":"launch-template","tags":[{"key":"Name","value":"cdk-ecs-fluentd/ASG/LaunchTemplate"}]}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnLaunchTemplate","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.LaunchTemplate","version":"0.0.0","metadata":[{"machineImage":"*","instanceType":"*","detailedMonitoring":false,"securityGroup":"*","userData":"*","associatePublicIpAddress":"*","spotOptions":"*","blockDevices":"*","instanceProfile":"*","keyPair":"*"}]}},"ASG":{"id":"ASG","path":"cdk-ecs-fluentd/ASG/ASG","attributes":{"aws:cdk:cloudformation:type":"AWS::AutoScaling::AutoScalingGroup","aws:cdk:cloudformation:props":{"launchTemplate":{"launchTemplateId":{"Ref":"ASGLaunchTemplate0CA92847"},"version":{"Fn::GetAtt":["ASGLaunchTemplate0CA92847","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"cdk-ecs-fluentd/ASG","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup","version":"0.0.0"}},"DrainECSHook":{"id":"DrainECSHook","path":"cdk-ecs-fluentd/ASG/DrainECSHook","children":{"Function":{"id":"Function","path":"cdk-ecs-fluentd/ASG/DrainECSHook/Function","children":{"ServiceRole":{"id":"ServiceRole","path":"cdk-ecs-fluentd/ASG/DrainECSHook/Function/ServiceRole","children":{"ImportServiceRole":{"id":"ImportServiceRole","path":"cdk-ecs-fluentd/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/DrainECSHook/Function/ServiceRole/Resource","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":"cdk-ecs-fluentd/ASG"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"cdk-ecs-fluentd/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource","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":"ASG46ED3070"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}],"Version":"2012-10-17"},"policyName":"ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27","roles":[{"Ref":"ASGDrainECSHookFunctionServiceRoleC12963BB"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]}}},"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":[{}]}]}},"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/DrainECSHook/Function/Resource","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('Got event without EC2InstanceId: %s', 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":"ClusterEB0386A7"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ASGDrainECSHookFunctionServiceRoleC12963BB","Arn"]},"runtime":"python3.9","tags":[{"key":"Name","value":"cdk-ecs-fluentd/ASG"}],"timeout":310}},"constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"0.0.0"}},"AllowInvoke:cdkecsfluentdASGLifecycleHookDrainHookTopicB96C269B":{"id":"AllowInvoke:cdkecsfluentdASGLifecycleHookDrainHookTopicB96C269B","path":"cdk-ecs-fluentd/ASG/DrainECSHook/Function/AllowInvoke:cdkecsfluentdASGLifecycleHookDrainHookTopicB96C269B","attributes":{"aws:cdk:cloudformation:type":"AWS::Lambda::Permission","aws:cdk:cloudformation:props":{"action":"lambda:InvokeFunction","functionName":{"Fn::GetAtt":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnPermission","version":"0.0.0"}},"Topic":{"id":"Topic","path":"cdk-ecs-fluentd/ASG/DrainECSHook/Function/Topic","children":{"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/DrainECSHook/Function/Topic/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Subscription","aws:cdk:cloudformation:props":{"endpoint":{"Fn::GetAtt":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_sns.CfnSubscription","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Subscription","version":"0.0.0","metadata":[{"topic":"*","endpoint":"*","protocol":"lambda","filterPolicy":"*","filterPolicyWithMessageBody":"*","region":"*","deadLetterQueue":"*"}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.Function","version":"0.0.0","metadata":[{"code":"*","handler":"*","runtime":"*","timeout":"*","environment":"*"},{"addEnvironment":["*","*"]}]}}},"constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"cdk-ecs-fluentd/ASG/LifecycleHookDrainHook","children":{"Topic":{"id":"Topic","path":"cdk-ecs-fluentd/ASG/LifecycleHookDrainHook/Topic","children":{"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/LifecycleHookDrainHook/Topic/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Topic","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"cdk-ecs-fluentd/ASG"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_sns.CfnTopic","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]}},"Role":{"id":"Role","path":"cdk-ecs-fluentd/ASG/LifecycleHookDrainHook/Role","children":{"ImportRole":{"id":"ImportRole","path":"cdk-ecs-fluentd/ASG/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/LifecycleHookDrainHook/Role/Resource","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":"cdk-ecs-fluentd/ASG"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"cdk-ecs-fluentd/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/LifecycleHookDrainHook/Role/DefaultPolicy/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":"sns:Publish","Effect":"Allow","Resource":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}],"Version":"2012-10-17"},"policyName":"ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57","roles":[{"Ref":"ASGLifecycleHookDrainHookRoleD640316C"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]}]}},"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/LifecycleHookDrainHook/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::AutoScaling::LifecycleHook","aws:cdk:cloudformation:props":{"autoScalingGroupName":{"Ref":"ASG46ED3070"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"},"roleArn":{"Fn::GetAtt":["ASGLifecycleHookDrainHookRoleD640316C","Arn"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.CfnLifecycleHook","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.LifecycleHook","version":"0.0.0","metadata":[{"autoScalingGroup":"*","lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","defaultResult":"CONTINUE","notificationTarget":"*","heartbeatTimeout":"*"}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","role":"*","userData":"*","instanceType":"*","machineImage":"*","minCapacity":"*"},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]}},"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","path":"cdk-ecs-fluentd/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--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-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","path":"cdk-ecs-fluentd/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"cdk-ecs-fluentd/EC2CapacityProvider","children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"cdk-ecs-fluentd/EC2CapacityProvider/EC2CapacityProvider","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::CapacityProvider","aws:cdk:cloudformation:props":{"autoScalingGroupProvider":{"autoScalingGroupArn":{"Ref":"ASG46ED3070"},"managedScaling":{"status":"ENABLED","targetCapacity":100},"managedTerminationProtection":"DISABLED"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCapacityProvider","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.AsgCapacityProvider","version":"0.0.0"}},"TaskDef":{"id":"TaskDef","path":"cdk-ecs-fluentd/TaskDef","children":{"TaskRole":{"id":"TaskRole","path":"cdk-ecs-fluentd/TaskDef/TaskRole","children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"cdk-ecs-fluentd/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/TaskDef/TaskRole/Resource","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]}},"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/TaskDef/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::TaskDefinition","aws:cdk:cloudformation:props":{"containerDefinitions":[{"essential":true,"image":"amazon/amazon-ecs-sample","memory":256,"name":"web","logConfiguration":{"logDriver":"fluentd","options":{"fluentd-async":"true"}}}],"family":"cdkecsfluentdTaskDefE7475183","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnTaskDefinition","version":"0.0.0"}},"web":{"id":"web","path":"cdk-ecs-fluentd/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]}},"EC2Service":{"id":"EC2Service","path":"cdk-ecs-fluentd/EC2Service","children":{"Service":{"id":"Service","path":"cdk-ecs-fluentd/EC2Service/Service","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::Service","aws:cdk:cloudformation:props":{"cluster":{"Ref":"ClusterEB0386A7"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"launchType":"EC2","schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnService","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]}},"BootstrapVersion":{"id":"BootstrapVersion","path":"cdk-ecs-fluentd/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"cdk-ecs-fluentd/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"}},"cdk-ecs-fluentd-test":{"id":"cdk-ecs-fluentd-test","path":"cdk-ecs-fluentd-test","children":{"DefaultTest":{"id":"DefaultTest","path":"cdk-ecs-fluentd-test/DefaultTest","children":{"Default":{"id":"Default","path":"cdk-ecs-fluentd-test/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"cdk-ecs-fluentd-test/DefaultTest/DeployAssert","children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"cdk-ecs-fluentd-test/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"cdk-ecs-fluentd-test/DefaultTest/DeployAssert/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"}}},"constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"}},"Tree":{"id":"Tree","path":"Tree","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.0.0"}}}
\ 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":{"cdk-ecs-fluentd":{"id":"cdk-ecs-fluentd","path":"cdk-ecs-fluentd","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"cdk-ecs-fluentd/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/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":"cdk-ecs-fluentd/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"cdk-ecs-fluentd/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":"cdk-ecs-fluentd/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/17","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"cdk-ecs-fluentd/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"cdk-ecs-fluentd/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"cdk-ecs-fluentd/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":"cdk-ecs-fluentd/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"cdk-ecs-fluentd/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"cdk-ecs-fluentd/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"cdk-ecs-fluentd/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":"cdk-ecs-fluentd/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"cdk-ecs-fluentd/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"cdk-ecs-fluentd/Vpc/PublicSubnet1"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"cdk-ecs-fluentd/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":"cdk-ecs-fluentd/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/17","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"cdk-ecs-fluentd/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"cdk-ecs-fluentd/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"cdk-ecs-fluentd/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":"cdk-ecs-fluentd/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"cdk-ecs-fluentd/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"cdk-ecs-fluentd/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"IGW":{"id":"IGW","path":"cdk-ecs-fluentd/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":"cdk-ecs-fluentd/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"cdk-ecs-fluentd/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"Cluster":{"id":"Cluster","path":"cdk-ecs-fluentd/Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addAsgCapacityProvider":["*"]}]},"children":{"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/Cluster/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":{}}},"Cluster":{"id":"Cluster","path":"cdk-ecs-fluentd/Cluster/Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"Ref":"EC2CapacityProvider5A2E35CD"}],"cluster":{"Ref":"ClusterEB0386A7"},"defaultCapacityProviderStrategy":[]}}}}},"InstanceRole":{"id":"InstanceRole","path":"cdk-ecs-fluentd/InstanceRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"managedPolicies":[{"managedPolicyArn":"*"},{"managedPolicyArn":"*"}]},{"applyRemovalPolicy":["destroy"]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportInstanceRole":{"id":"ImportInstanceRole","path":"cdk-ecs-fluentd/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/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"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AmazonEC2ContainerServiceForEC2Role"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/AmazonSSMManagedInstanceCore"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"cdk-ecs-fluentd/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":"cdk-ecs-fluentd/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":["ClusterEB0386A7","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"InstanceRoleDefaultPolicy1531605C","roles":[{"Ref":"InstanceRole3CCE2F1D"}]}}}}}}},"ASG":{"id":"ASG","path":"cdk-ecs-fluentd/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","role":"*","userData":"*","instanceType":"*","machineImage":"*","minCapacity":"*"},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"cdk-ecs-fluentd/ASG/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/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":"cdk-ecs-fluentd/ASG/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"cdk-ecs-fluentd/ASG"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"cdk-ecs-fluentd/ASG/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":"InstanceRole3CCE2F1D"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"cdk-ecs-fluentd/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"cdk-ecs-fluentd/ASG/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":"cdk-ecs-fluentd/ASG/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":["ASGInstanceProfile0A2834D7","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2023recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["ASGInstanceSecurityGroup0525485D","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"cdk-ecs-fluentd/ASG/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"cdk-ecs-fluentd/ASG/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\nset -xe\ncurl -fsSL https://toolbelt.treasuredata.com/sh/install-amazon2023-fluent-package5-lts.sh | sh\nsudo systemctl start fluentd\necho ECS_CLUSTER=",{"Ref":"ClusterEB0386A7"}," >> /etc/ecs/ecs.config"]]}}},"tagSpecifications":[{"resourceType":"launch-template","tags":[{"key":"Name","value":"cdk-ecs-fluentd/ASG/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"cdk-ecs-fluentd/ASG/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":"ASGLaunchTemplate0CA92847"},"version":{"Fn::GetAtt":["ASGLaunchTemplate0CA92847","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"cdk-ecs-fluentd/ASG","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"cdk-ecs-fluentd/ASG/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"cdk-ecs-fluentd/ASG/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":"cdk-ecs-fluentd/ASG/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":"cdk-ecs-fluentd/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/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":"cdk-ecs-fluentd/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"cdk-ecs-fluentd/ASG/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":"cdk-ecs-fluentd/ASG/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":"ASG46ED3070"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["ClusterEB0386A7","Arn"]}}],"Version":"2012-10-17"},"policyName":"ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27","roles":[{"Ref":"ASGDrainECSHookFunctionServiceRoleC12963BB"}]}}}}}}},"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/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":"ClusterEB0386A7"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ASGDrainECSHookFunctionServiceRoleC12963BB","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"cdk-ecs-fluentd/ASG"}],"timeout":310}}},"AllowInvoke:cdkecsfluentdASGLifecycleHookDrainHookTopicB96C269B":{"id":"AllowInvoke:cdkecsfluentdASGLifecycleHookDrainHookTopicB96C269B","path":"cdk-ecs-fluentd/ASG/DrainECSHook/Function/AllowInvoke:cdkecsfluentdASGLifecycleHookDrainHookTopicB96C269B","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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}},"Topic":{"id":"Topic","path":"cdk-ecs-fluentd/ASG/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":"cdk-ecs-fluentd/ASG/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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"cdk-ecs-fluentd/ASG/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":"cdk-ecs-fluentd/ASG/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/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":"cdk-ecs-fluentd/ASG"}]}}}}},"Role":{"id":"Role","path":"cdk-ecs-fluentd/ASG/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":"cdk-ecs-fluentd/ASG/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/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":"cdk-ecs-fluentd/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"cdk-ecs-fluentd/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/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":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}],"Version":"2012-10-17"},"policyName":"ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57","roles":[{"Ref":"ASGLifecycleHookDrainHookRoleD640316C"}]}}}}}}},"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/ASG/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":"ASG46ED3070"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"},"roleArn":{"Fn::GetAtt":["ASGLifecycleHookDrainHookRoleD640316C","Arn"]}}}}}}}},"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter","path":"cdk-ecs-fluentd/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--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-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","path":"cdk-ecs-fluentd/SsmParameterValue:--aws--service--ecs--optimized-ami--amazon-linux-2023--recommended--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"cdk-ecs-fluentd/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.AsgCapacityProvider","version":"0.0.0"},"children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"cdk-ecs-fluentd/EC2CapacityProvider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCapacityProvider","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::CapacityProvider","aws:cdk:cloudformation:props":{"autoScalingGroupProvider":{"autoScalingGroupArn":{"Ref":"ASG46ED3070"},"managedScaling":{"status":"ENABLED","targetCapacity":100},"managedTerminationProtection":"DISABLED"}}}}}},"TaskDef":{"id":"TaskDef","path":"cdk-ecs-fluentd/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"cdk-ecs-fluentd/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"cdk-ecs-fluentd/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"cdk-ecs-fluentd/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":"cdk-ecs-fluentd/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","logConfiguration":{"logDriver":"fluentd","options":{"fluentd-async":"true"}}}],"family":"cdkecsfluentdTaskDefE7475183","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"web":{"id":"web","path":"cdk-ecs-fluentd/TaskDef/web","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"EC2Service":{"id":"EC2Service","path":"cdk-ecs-fluentd/EC2Service","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2Service","version":"0.0.0","metadata":["*","*"]},"children":{"Service":{"id":"Service","path":"cdk-ecs-fluentd/EC2Service/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":"ClusterEB0386A7"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"launchType":"EC2","schedulingStrategy":"REPLICA","taskDefinition":{"Ref":"TaskDef54694570"}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"cdk-ecs-fluentd/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"cdk-ecs-fluentd/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"cdk-ecs-fluentd-test":{"id":"cdk-ecs-fluentd-test","path":"cdk-ecs-fluentd-test","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"cdk-ecs-fluentd-test/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"cdk-ecs-fluentd-test/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"cdk-ecs-fluentd-test/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"cdk-ecs-fluentd-test/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"cdk-ecs-fluentd-test/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-efs/test/integ.efs-filesystem-policy.js.snapshot/FileSystemPolicyTestDefaultTestDeployAssertD0596FC1.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/FileSystemPolicyTestDefaultTestDeployAssertD0596FC1.assets.json
index 5d48b9195d19f..9a7b0cb465e35 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/FileSystemPolicyTestDefaultTestDeployAssertD0596FC1.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/FileSystemPolicyTestDefaultTestDeployAssertD0596FC1.assets.json
@@ -1,13 +1,14 @@
{
- "version": "33.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "FileSystemPolicyTestDefaultTestDeployAssertD0596FC1 Template",
"source": {
"path": "FileSystemPolicyTestDefaultTestDeployAssertD0596FC1.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/cdk.out
index 560dae10d018f..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"33.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/integ.json
index 5b272b4eeef41..fbd608feb2ec6 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "33.0.0",
+ "version": "45.0.0",
"testCases": {
"FileSystemPolicyTest/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "FileSystemPolicyTest/DefaultTest/DeployAssert",
"assertionStackName": "FileSystemPolicyTestDefaultTestDeployAssertD0596FC1"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/manifest.json
index ac9d4acb42f23..bd35ce05ff792 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "33.0.0",
+ "version": "48.0.0",
"artifacts": {
"test-efs-integ.assets": {
"type": "cdk:asset-manifest",
@@ -14,6 +14,7 @@
"environment": "aws://unknown-account/unknown-region",
"properties": {
"templateFile": "test-efs-integ.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}",
@@ -33,12 +34,58 @@
"test-efs-integ.assets"
],
"metadata": {
+ "/test-efs-integ/Vpc": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "maxAzs": "*",
+ "natGateways": "*",
+ "restrictDefaultSecurityGroup": false
+ }
+ }
+ ],
"/test-efs-integ/Vpc/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "Vpc8378EB38"
}
],
+ "/test-efs-integ/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": [
+ "*"
+ ]
+ }
+ }
+ ],
"/test-efs-integ/Vpc/PublicSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -75,6 +122,34 @@
"data": "VpcPublicSubnet1NATGateway4D7517AA"
}
],
+ "/test-efs-integ/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": {}
+ }
+ ],
"/test-efs-integ/Vpc/PublicSubnet2/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -99,6 +174,34 @@
"data": "VpcPublicSubnet2DefaultRoute97F91067"
}
],
+ "/test-efs-integ/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": {}
+ }
+ ],
"/test-efs-integ/Vpc/PrivateSubnet1/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -123,6 +226,34 @@
"data": "VpcPrivateSubnet1DefaultRouteBE02A9ED"
}
],
+ "/test-efs-integ/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": {}
+ }
+ ],
"/test-efs-integ/Vpc/PrivateSubnet2/Subnet": [
{
"type": "aws:cdk:logicalId",
@@ -159,12 +290,29 @@
"data": "VpcVPCGWBF912B6E"
}
],
+ "/test-efs-integ/FileSystem": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*",
+ "fileSystemPolicy": "*"
+ }
+ }
+ ],
"/test-efs-integ/FileSystem/Resource": [
{
"type": "aws:cdk:logicalId",
"data": "FileSystem8A8E25C0"
}
],
+ "/test-efs-integ/FileSystem/EfsSecurityGroup": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "vpc": "*"
+ }
+ }
+ ],
"/test-efs-integ/FileSystem/EfsSecurityGroup/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -183,6 +331,14 @@
"data": "FileSystemEfsMountTargetPrivateSubnet265F3ED67"
}
],
+ "/test-efs-integ/AccessPoint": [
+ {
+ "type": "aws:cdk:analytics:construct",
+ "data": {
+ "fileSystem": "*"
+ }
+ }
+ ],
"/test-efs-integ/AccessPoint/Resource": [
{
"type": "aws:cdk:logicalId",
@@ -217,6 +373,7 @@
"environment": "aws://unknown-account/unknown-region",
"properties": {
"templateFile": "FileSystemPolicyTestDefaultTestDeployAssertD0596FC1.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}",
@@ -256,6 +413,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/test-efs-integ.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/test-efs-integ.assets.json
index 7d8bfcbbd3d10..d33cd6bb435d3 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/test-efs-integ.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/test-efs-integ.assets.json
@@ -1,13 +1,14 @@
{
- "version": "33.0.0",
+ "version": "45.0.0",
"files": {
"7ae1d2527c3779ce32e98c5ca2ec2521998e4d2632aa17a5c6836a79a655f0a6": {
+ "displayName": "test-efs-integ Template",
"source": {
"path": "test-efs-integ.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-f95f9260": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
"objectKey": "7ae1d2527c3779ce32e98c5ca2ec2521998e4d2632aa17a5c6836a79a655f0a6.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/tree.json
index 22bc555f8c532..fccc5187ccd66 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-policy.js.snapshot/tree.json
@@ -1,932 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "test-efs-integ": {
- "id": "test-efs-integ",
- "path": "test-efs-integ",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "test-efs-integ/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "test-efs-integ/Vpc/Resource",
- "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": "test-efs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "test-efs-integ/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "test-efs-integ/Vpc/PublicSubnet1/Subnet",
- "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": "test-efs-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "test-efs-integ/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "test-efs-integ/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "test-efs-integ/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "test-efs-integ/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "test-efs-integ/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "test-efs-integ/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "test-efs-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "test-efs-integ/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "test-efs-integ/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
- "version": "0.0.0"
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "test-efs-integ/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "test-efs-integ/Vpc/PublicSubnet2/Subnet",
- "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": "test-efs-integ/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "test-efs-integ/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "test-efs-integ/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "test-efs-integ/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "test-efs-integ/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet2Subnet691E08A3"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "test-efs-integ/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet2RouteTable94F7E489"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
- "version": "0.0.0"
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "test-efs-integ/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "test-efs-integ/Vpc/PrivateSubnet1/Subnet",
- "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": "test-efs-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "test-efs-integ/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "test-efs-integ/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "test-efs-integ/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "test-efs-integ/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "test-efs-integ/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
- "version": "0.0.0"
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "test-efs-integ/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "test-efs-integ/Vpc/PrivateSubnet2/Subnet",
- "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": "test-efs-integ/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "test-efs-integ/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0"
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "test-efs-integ/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "test-efs-integ/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "test-efs-integ/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "test-efs-integ/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet2RouteTableA678073B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
- "version": "0.0.0"
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "test-efs-integ/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "test-efs-integ/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "test-efs-integ/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0"
- }
- },
- "FileSystem": {
- "id": "FileSystem",
- "path": "test-efs-integ/FileSystem",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "test-efs-integ/FileSystem/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EFS::FileSystem",
- "aws:cdk:cloudformation:props": {
- "encrypted": true,
- "fileSystemPolicy": {
- "Statement": [
- {
- "Action": [
- "elasticfilesystem:ClientMount",
- "elasticfilesystem:ClientWrite"
- ],
- "Condition": {
- "Bool": {
- "elasticfilesystem:AccessedViaMountTarget": "true"
- }
- },
- "Effect": "Allow",
- "Principal": {
- "AWS": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":iam::",
- {
- "Ref": "AWS::AccountId"
- },
- ":root"
- ]
- ]
- }
- },
- "Resource": "*"
- },
- {
- "Action": "elasticfilesystem:ClientRootAccess",
- "Condition": {
- "Bool": {
- "elasticfilesystem:AccessedViaMountTarget": "true"
- }
- },
- "Effect": "Allow",
- "Principal": {
- "AWS": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":iam::",
- {
- "Ref": "AWS::AccountId"
- },
- ":root"
- ]
- ]
- }
- },
- "Resource": "*"
- },
- {
- "Action": [
- "elasticfilesystem:ClientRootAccess",
- "elasticfilesystem:ClientWrite"
- ],
- "Condition": {
- "Bool": {
- "elasticfilesystem:AccessedViaMountTarget": "true"
- }
- },
- "Effect": "Allow",
- "Principal": {
- "AWS": "*"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "fileSystemTags": [
- {
- "key": "Name",
- "value": "test-efs-integ/FileSystem"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_efs.CfnFileSystem",
- "version": "0.0.0"
- }
- },
- "EfsSecurityGroup": {
- "id": "EfsSecurityGroup",
- "path": "test-efs-integ/FileSystem/EfsSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "test-efs-integ/FileSystem/EfsSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "test-efs-integ/FileSystem/EfsSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "test-efs-integ/FileSystem"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0"
- }
- },
- "EfsMountTarget-PrivateSubnet1": {
- "id": "EfsMountTarget-PrivateSubnet1",
- "path": "test-efs-integ/FileSystem/EfsMountTarget-PrivateSubnet1",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EFS::MountTarget",
- "aws:cdk:cloudformation:props": {
- "fileSystemId": {
- "Ref": "FileSystem8A8E25C0"
- },
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "FileSystemEfsSecurityGroup212D3ACB",
- "GroupId"
- ]
- }
- ],
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_efs.CfnMountTarget",
- "version": "0.0.0"
- }
- },
- "EfsMountTarget-PrivateSubnet2": {
- "id": "EfsMountTarget-PrivateSubnet2",
- "path": "test-efs-integ/FileSystem/EfsMountTarget-PrivateSubnet2",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EFS::MountTarget",
- "aws:cdk:cloudformation:props": {
- "fileSystemId": {
- "Ref": "FileSystem8A8E25C0"
- },
- "securityGroups": [
- {
- "Fn::GetAtt": [
- "FileSystemEfsSecurityGroup212D3ACB",
- "GroupId"
- ]
- }
- ],
- "subnetId": {
- "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_efs.CfnMountTarget",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_efs.FileSystem",
- "version": "0.0.0"
- }
- },
- "AccessPoint": {
- "id": "AccessPoint",
- "path": "test-efs-integ/AccessPoint",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "test-efs-integ/AccessPoint/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EFS::AccessPoint",
- "aws:cdk:cloudformation:props": {
- "fileSystemId": {
- "Ref": "FileSystem8A8E25C0"
- },
- "rootDirectory": {},
- "accessPointTags": [
- {
- "key": "Name",
- "value": "MyAccessPoint"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_efs.CfnAccessPoint",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_efs.AccessPoint",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "test-efs-integ/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "test-efs-integ/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "FileSystemPolicyTest": {
- "id": "FileSystemPolicyTest",
- "path": "FileSystemPolicyTest",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "FileSystemPolicyTest/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "FileSystemPolicyTest/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.2.69"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "FileSystemPolicyTest/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "FileSystemPolicyTest/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "FileSystemPolicyTest/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.2.69"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"test-efs-integ":{"id":"test-efs-integ","path":"test-efs-integ","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"test-efs-integ/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","natGateways":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"test-efs-integ/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":"test-efs-integ/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"test-efs-integ/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":"test-efs-integ/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":"test-efs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"test-efs-integ/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"test-efs-integ/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":"test-efs-integ/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"test-efs-integ/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"test-efs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"test-efs-integ/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":"test-efs-integ/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"test-efs-integ/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"test-efs-integ/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"test-efs-integ/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":"*"},{}]},"children":{"Subnet":{"id":"Subnet","path":"test-efs-integ/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":"test-efs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"test-efs-integ/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"test-efs-integ/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":"test-efs-integ/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"test-efs-integ/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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"test-efs-integ/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"test-efs-integ/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":"test-efs-integ/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":"test-efs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"test-efs-integ/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"test-efs-integ/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":"test-efs-integ/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"test-efs-integ/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"test-efs-integ/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"test-efs-integ/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":"test-efs-integ/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":"test-efs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"test-efs-integ/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"test-efs-integ/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":"test-efs-integ/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"test-efs-integ/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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"test-efs-integ/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet2RouteTableA678073B"}}}}}},"IGW":{"id":"IGW","path":"test-efs-integ/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":"test-efs-integ/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"test-efs-integ/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"FileSystem":{"id":"FileSystem","path":"test-efs-integ/FileSystem","constructInfo":{"fqn":"aws-cdk-lib.aws_efs.FileSystem","version":"0.0.0","metadata":[{"vpc":"*","fileSystemPolicy":"*"}]},"children":{"Resource":{"id":"Resource","path":"test-efs-integ/FileSystem/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_efs.CfnFileSystem","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EFS::FileSystem","aws:cdk:cloudformation:props":{"encrypted":true,"fileSystemPolicy":{"Statement":[{"Action":["elasticfilesystem:ClientMount","elasticfilesystem:ClientWrite"],"Condition":{"Bool":{"elasticfilesystem:AccessedViaMountTarget":"true"}},"Effect":"Allow","Principal":{"AWS":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::",{"Ref":"AWS::AccountId"},":root"]]}},"Resource":"*"},{"Action":"elasticfilesystem:ClientRootAccess","Condition":{"Bool":{"elasticfilesystem:AccessedViaMountTarget":"true"}},"Effect":"Allow","Principal":{"AWS":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::",{"Ref":"AWS::AccountId"},":root"]]}},"Resource":"*"},{"Action":["elasticfilesystem:ClientRootAccess","elasticfilesystem:ClientWrite"],"Condition":{"Bool":{"elasticfilesystem:AccessedViaMountTarget":"true"}},"Effect":"Allow","Principal":{"AWS":"*"}}],"Version":"2012-10-17"},"fileSystemTags":[{"key":"Name","value":"test-efs-integ/FileSystem"}]}}},"EfsSecurityGroup":{"id":"EfsSecurityGroup","path":"test-efs-integ/FileSystem/EfsSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*"}]},"children":{"Resource":{"id":"Resource","path":"test-efs-integ/FileSystem/EfsSecurityGroup/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":"test-efs-integ/FileSystem/EfsSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"test-efs-integ/FileSystem"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EfsMountTarget-PrivateSubnet1":{"id":"EfsMountTarget-PrivateSubnet1","path":"test-efs-integ/FileSystem/EfsMountTarget-PrivateSubnet1","constructInfo":{"fqn":"aws-cdk-lib.aws_efs.CfnMountTarget","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EFS::MountTarget","aws:cdk:cloudformation:props":{"fileSystemId":{"Ref":"FileSystem8A8E25C0"},"securityGroups":[{"Fn::GetAtt":["FileSystemEfsSecurityGroup212D3ACB","GroupId"]}],"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"EfsMountTarget-PrivateSubnet2":{"id":"EfsMountTarget-PrivateSubnet2","path":"test-efs-integ/FileSystem/EfsMountTarget-PrivateSubnet2","constructInfo":{"fqn":"aws-cdk-lib.aws_efs.CfnMountTarget","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EFS::MountTarget","aws:cdk:cloudformation:props":{"fileSystemId":{"Ref":"FileSystem8A8E25C0"},"securityGroups":[{"Fn::GetAtt":["FileSystemEfsSecurityGroup212D3ACB","GroupId"]}],"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}}}}},"AccessPoint":{"id":"AccessPoint","path":"test-efs-integ/AccessPoint","constructInfo":{"fqn":"aws-cdk-lib.aws_efs.AccessPoint","version":"0.0.0","metadata":[{"fileSystem":"*"}]},"children":{"Resource":{"id":"Resource","path":"test-efs-integ/AccessPoint/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_efs.CfnAccessPoint","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EFS::AccessPoint","aws:cdk:cloudformation:props":{"fileSystemId":{"Ref":"FileSystem8A8E25C0"},"rootDirectory":{},"accessPointTags":[{"key":"Name","value":"MyAccessPoint"}]}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"test-efs-integ/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"test-efs-integ/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"FileSystemPolicyTest":{"id":"FileSystemPolicyTest","path":"FileSystemPolicyTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"FileSystemPolicyTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"FileSystemPolicyTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"FileSystemPolicyTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"FileSystemPolicyTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"FileSystemPolicyTest/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-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/EcsTestDefaultTestDeployAssert8B2741C4.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/EcsTestDefaultTestDeployAssert8B2741C4.assets.json
index 0ae13e6e6f145..f825663b59452 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/EcsTestDefaultTestDeployAssert8B2741C4.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/EcsTestDefaultTestDeployAssert8B2741C4.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "EcsTestDefaultTestDeployAssert8B2741C4 Template",
"source": {
"path": "EcsTestDefaultTestDeployAssert8B2741C4.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/aws-ecs-integ-ecs.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/aws-ecs-integ-ecs.assets.json
index 47afae0dc1274..70cae5b645bad 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/aws-ecs-integ-ecs.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/aws-ecs-integ-ecs.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "ee35cf472ce78f1d456487da60be68160f2e4880f21e809ef8b80cd977d34d27": {
+ "6d6dfb3844ad476df26773f6bd0230d9cff327a8bce8e40d19fb88020fa2bf7d": {
+ "displayName": "aws-ecs-integ-ecs Template",
"source": {
"path": "aws-ecs-integ-ecs.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-82d57f8f": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "ee35cf472ce78f1d456487da60be68160f2e4880f21e809ef8b80cd977d34d27.json",
+ "objectKey": "6d6dfb3844ad476df26773f6bd0230d9cff327a8bce8e40d19fb88020fa2bf7d.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
@@ -17,11 +18,12 @@
},
"dockerImages": {
"cb8db1ca45b29cf8a7db558e2cb31ac823252251ae003dc87318f485c6415d2b": {
+ "displayName": "TaskDef/TheContainer/AssetImage",
"source": {
"directory": "asset.cb8db1ca45b29cf8a7db558e2cb31ac823252251ae003dc87318f485c6415d2b"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-ac25353e": {
"repositoryName": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}",
"imageTag": "cb8db1ca45b29cf8a7db558e2cb31ac823252251ae003dc87318f485c6415d2b",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-image-publishing-role-${AWS::AccountId}-${AWS::Region}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/aws-ecs-integ-ecs.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/aws-ecs-integ-ecs.template.json
index 0bbc27f6b014a..15ef5576688da 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/aws-ecs-integ-ecs.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/aws-ecs-integ-ecs.template.json
@@ -575,7 +575,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -591,7 +591,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/integ.json
index 2518dd48c6297..4ebab066266b9 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"EcsTest/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "EcsTest/DefaultTest/DeployAssert",
"assertionStackName": "EcsTestDefaultTestDeployAssert8B2741C4"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/manifest.json
index d03c18360cbfb..4bc101f1bb9eb 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ-ecs.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/ee35cf472ce78f1d456487da60be68160f2e4880f21e809ef8b80cd977d34d27.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/6d6dfb3844ad476df26773f6bd0230d9cff327a8bce8e40d19fb88020fa2bf7d.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1150,51 +1150,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole075025F00",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19CB19D22",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole25F218D50",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole30F54BDDC",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3": [
- {
- "type": "aws:cdk:logicalId",
- "data": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole4C9B545F3",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-ecs-integ-ecs"
@@ -1252,6 +1207,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/tree.json
index 74ee6821d4c2d..93b446c387a4a 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events-targets/test/ecs/integ.event-ec2-task.js.snapshot/tree.json
@@ -1,2382 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-ecs-integ-ecs": {
- "id": "aws-ecs-integ-ecs",
- "path": "aws-ecs-integ-ecs",
- "children": {
- "Vpc": {
- "id": "Vpc",
- "path": "aws-ecs-integ-ecs/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/Vpc/Resource",
- "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-ecs-integ-ecs/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 0,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.0.0/17",
- "mapPublicIpOnLaunch": true,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "Public"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Public"
- },
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "routeTableId": {
- "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-ecs-integ-ecs/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "VpcPublicSubnet1EIPD7E02669",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/Subnet",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
- "aws:cdk:cloudformation:props": {
- "availabilityZone": {
- "Fn::Select": [
- 0,
- {
- "Fn::GetAZs": ""
- }
- ]
- },
- "cidrBlock": "10.0.128.0/17",
- "mapPublicIpOnLaunch": false,
- "tags": [
- {
- "key": "aws-cdk:subnet-name",
- "value": "Private"
- },
- {
- "key": "aws-cdk:subnet-type",
- "value": "Private"
- },
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- },
- "subnetId": {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-ecs-integ-ecs/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
- },
- "routeTableId": {
- "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-ecs-integ-ecs/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-ecs-integ-ecs/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "VpcIGWD7BA715C"
- },
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*",
- "restrictDefaultSecurityGroup": false
- }
- ]
- }
- },
- "EcsCluster": {
- "id": "EcsCluster",
- "path": "aws-ecs-integ-ecs/EcsCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Vpc8378EB38"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "EcsClusterDefaultAutoScalingGroupInstanceRole3C026863"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/ASG",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "VpcPrivateSubnet1Subnet536B997A"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF": {
- "id": "AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "EcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicACD2D4A4"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "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"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "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"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*"
- },
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*"
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-ecs-integ-ecs/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-ecs-integ-ecs/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": []
- }
- },
- "MyDeadLetterQueue": {
- "id": "MyDeadLetterQueue",
- "path": "aws-ecs-integ-ecs/MyDeadLetterQueue",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/MyDeadLetterQueue/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SQS::Queue",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.CfnQueue",
- "version": "0.0.0"
- }
- },
- "Policy": {
- "id": "Policy",
- "path": "aws-ecs-integ-ecs/MyDeadLetterQueue/Policy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/MyDeadLetterQueue/Policy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SQS::QueuePolicy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sqs:SendMessage",
- "Condition": {
- "ArnEquals": {
- "aws:SourceArn": {
- "Fn::GetAtt": [
- "Rule4C995B7F",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Principal": {
- "Service": "events.amazonaws.com"
- },
- "Resource": {
- "Fn::GetAtt": [
- "MyDeadLetterQueueD997968A",
- "Arn"
- ]
- },
- "Sid": "AllowEventRuleawsecsintegecsRuleB8841E8B"
- }
- ],
- "Version": "2012-10-17"
- },
- "queues": [
- {
- "Ref": "MyDeadLetterQueueD997968A"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.CfnQueuePolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.QueuePolicy",
- "version": "0.0.0",
- "metadata": [
- {
- "queues": [
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sqs.Queue",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "TaskDef": {
- "id": "TaskDef",
- "path": "aws-ecs-integ-ecs/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-ecs-integ-ecs/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-ecs-integ-ecs/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": {
- "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:cb8db1ca45b29cf8a7db558e2cb31ac823252251ae003dc87318f485c6415d2b"
- },
- "memory": 256,
- "name": "TheContainer",
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": {
- "Ref": "TaskDefTheContainerLogGroupD94C8EF5"
- },
- "awslogs-stream-prefix": "EventDemo",
- "awslogs-region": {
- "Ref": "AWS::Region"
- }
- }
- }
- }
- ],
- "executionRoleArn": {
- "Fn::GetAtt": [
- "TaskDefExecutionRoleB4775C97",
- "Arn"
- ]
- },
- "family": "awsecsintegecsTaskDef8DD0C801",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "TheContainer": {
- "id": "TheContainer",
- "path": "aws-ecs-integ-ecs/TaskDef/TheContainer",
- "children": {
- "AssetImage": {
- "id": "AssetImage",
- "path": "aws-ecs-integ-ecs/TaskDef/TheContainer/AssetImage",
- "children": {
- "Staging": {
- "id": "Staging",
- "path": "aws-ecs-integ-ecs/TaskDef/TheContainer/AssetImage/Staging",
- "constructInfo": {
- "fqn": "aws-cdk-lib.AssetStaging",
- "version": "0.0.0"
- }
- },
- "Repository": {
- "id": "Repository",
- "path": "aws-ecs-integ-ecs/TaskDef/TheContainer/AssetImage/Repository",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase",
- "version": "0.0.0",
- "metadata": []
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset",
- "version": "0.0.0"
- }
- },
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-ecs-integ-ecs/TaskDef/TheContainer/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/TaskDef/TheContainer/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "retention": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-ecs-integ-ecs/TaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-ecs-integ-ecs/TaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/TaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/TaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/TaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "ecr:BatchCheckLayerAvailability",
- "ecr:BatchGetImage",
- "ecr:GetDownloadUrlForLayer"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecr:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":repository/",
- {
- "Fn::Sub": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"
- }
- ]
- ]
- }
- },
- {
- "Action": "ecr:GetAuthorizationToken",
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "TaskDefTheContainerLogGroupD94C8EF5",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "TaskDefExecutionRoleDefaultPolicy0DBB737A",
- "roles": [
- {
- "Ref": "TaskDefExecutionRoleB4775C97"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- },
- "roleName": "*"
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "EventsRole": {
- "id": "EventsRole",
- "path": "aws-ecs-integ-ecs/TaskDef/EventsRole",
- "children": {
- "ImportEventsRole": {
- "id": "ImportEventsRole",
- "path": "aws-ecs-integ-ecs/TaskDef/EventsRole/ImportEventsRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/TaskDef/EventsRole/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Role",
- "aws:cdk:cloudformation:props": {
- "assumeRolePolicyDocument": {
- "Statement": [
- {
- "Action": "sts:AssumeRole",
- "Effect": "Allow",
- "Principal": {
- "Service": "events.amazonaws.com"
- }
- }
- ],
- "Version": "2012-10-17"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-ecs-integ-ecs/TaskDef/EventsRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/TaskDef/EventsRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "ecs:RunTask",
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "EcsCluster97242B84",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": {
- "Ref": "TaskDef54694570"
- }
- },
- {
- "Action": "ecs:TagResource",
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecs:",
- {
- "Ref": "AWS::Region"
- },
- ":*:task/",
- {
- "Ref": "EcsCluster97242B84"
- },
- "/*"
- ]
- ]
- }
- },
- {
- "Action": "iam:PassRole",
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "TaskDefExecutionRoleB4775C97",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "TaskDefEventsRoleDefaultPolicyA124E85B",
- "roles": [
- {
- "Ref": "TaskDefEventsRoleFB3B67B8"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*",
- "*"
- ]
- }
- },
- "Rule": {
- "id": "Rule",
- "path": "aws-ecs-integ-ecs/Rule",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-ecs-integ-ecs/Rule/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Events::Rule",
- "aws:cdk:cloudformation:props": {
- "scheduleExpression": "rate(1 minute)",
- "state": "ENABLED",
- "targets": [
- {
- "id": "Target0",
- "arn": {
- "Fn::GetAtt": [
- "EcsCluster97242B84",
- "Arn"
- ]
- },
- "roleArn": {
- "Fn::GetAtt": [
- "TaskDefEventsRoleFB3B67B8",
- "Arn"
- ]
- },
- "ecsParameters": {
- "taskCount": 1,
- "taskDefinitionArn": {
- "Ref": "TaskDef54694570"
- },
- "propagateTags": "TASK_DEFINITION",
- "tagList": [
- {
- "key": "my_tag",
- "value": "my_tag_value"
- }
- ]
- },
- "deadLetterConfig": {
- "arn": {
- "Fn::GetAtt": [
- "MyDeadLetterQueueD997968A",
- "Arn"
- ]
- }
- },
- "input": "{\"containerOverrides\":[{\"name\":\"TheContainer\",\"environment\":[{\"name\":\"I_WAS_TRIGGERED\",\"value\":\"From CloudWatch Events\"}]}],\"cpu\":\"512\",\"memory\":\"512\"}"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_events.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_events.Rule",
- "version": "0.0.0",
- "metadata": [
- {
- "schedule": "*"
- },
- {
- "addEventPattern": [
- "*"
- ]
- },
- {
- "addTarget": [
- {}
- ]
- }
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-ecs-integ-ecs/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-ecs-integ-ecs/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "EcsTest": {
- "id": "EcsTest",
- "path": "EcsTest",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "EcsTest/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "EcsTest/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "EcsTest/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "EcsTest/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "EcsTest/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-ecs-integ-ecs":{"id":"aws-ecs-integ-ecs","path":"aws-ecs-integ-ecs","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-ecs/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*","restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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/17","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"aws-ecs-integ-ecs/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-ecs/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-ecs-integ-ecs/Vpc/PublicSubnet1"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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/17","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"aws-ecs-integ-ecs/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-ecs-integ-ecs/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-ecs/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-integ-ecs/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"IGW":{"id":"IGW","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-ecs/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPrivateSubnet1Subnet536B997A"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF":{"id":"AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF","path":"aws-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awsecsintegecsEcsClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic0C4958AF","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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/EcsCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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-ecs-integ-ecs/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":[]}},"MyDeadLetterQueue":{"id":"MyDeadLetterQueue","path":"aws-ecs-integ-ecs/MyDeadLetterQueue","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.Queue","version":"0.0.0","metadata":["*"]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/MyDeadLetterQueue/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueue","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::Queue","aws:cdk:cloudformation:props":{}}},"Policy":{"id":"Policy","path":"aws-ecs-integ-ecs/MyDeadLetterQueue/Policy","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.QueuePolicy","version":"0.0.0","metadata":[{"queues":["*"]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/MyDeadLetterQueue/Policy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.CfnQueuePolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SQS::QueuePolicy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":"sqs:SendMessage","Condition":{"ArnEquals":{"aws:SourceArn":{"Fn::GetAtt":["Rule4C995B7F","Arn"]}}},"Effect":"Allow","Principal":{"Service":"events.amazonaws.com"},"Resource":{"Fn::GetAtt":["MyDeadLetterQueueD997968A","Arn"]},"Sid":"AllowEventRuleawsecsintegecsRuleB8841E8B"}],"Version":"2012-10-17"},"queues":[{"Ref":"MyDeadLetterQueueD997968A"}]}}}}}}},"TaskDef":{"id":"TaskDef","path":"aws-ecs-integ-ecs/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-ecs/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-integ-ecs/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/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-ecs-integ-ecs/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":{"Fn::Sub":"${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:cb8db1ca45b29cf8a7db558e2cb31ac823252251ae003dc87318f485c6415d2b"},"memory":256,"name":"TheContainer","logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"TaskDefTheContainerLogGroupD94C8EF5"},"awslogs-stream-prefix":"EventDemo","awslogs-region":{"Ref":"AWS::Region"}}}}],"executionRoleArn":{"Fn::GetAtt":["TaskDefExecutionRoleB4775C97","Arn"]},"family":"awsecsintegecsTaskDef8DD0C801","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"TheContainer":{"id":"TheContainer","path":"aws-ecs-integ-ecs/TaskDef/TheContainer","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"AssetImage":{"id":"AssetImage","path":"aws-ecs-integ-ecs/TaskDef/TheContainer/AssetImage","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr_assets.DockerImageAsset","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-ecs-integ-ecs/TaskDef/TheContainer/AssetImage/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Repository":{"id":"Repository","path":"aws-ecs-integ-ecs/TaskDef/TheContainer/AssetImage/Repository","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr.RepositoryBase","version":"0.0.0","metadata":[]}}}},"LogGroup":{"id":"LogGroup","path":"aws-ecs-integ-ecs/TaskDef/TheContainer/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/TaskDef/TheContainer/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-ecs-integ-ecs/TaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-integ-ecs/TaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/TaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/TaskDef/ExecutionRole/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-ecs-integ-ecs/TaskDef/ExecutionRole/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":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Fn::Sub":"cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"}]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"},{"Action":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["TaskDefTheContainerLogGroupD94C8EF5","Arn"]}}],"Version":"2012-10-17"},"policyName":"TaskDefExecutionRoleDefaultPolicy0DBB737A","roles":[{"Ref":"TaskDefExecutionRoleB4775C97"}]}}}}}}},"EventsRole":{"id":"EventsRole","path":"aws-ecs-integ-ecs/TaskDef/EventsRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportEventsRole":{"id":"ImportEventsRole","path":"aws-ecs-integ-ecs/TaskDef/EventsRole/ImportEventsRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/TaskDef/EventsRole/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":"events.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-ecs/TaskDef/EventsRole/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-ecs-integ-ecs/TaskDef/EventsRole/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:RunTask","Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]}}},"Effect":"Allow","Resource":{"Ref":"TaskDef54694570"}},{"Action":"ecs:TagResource","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecs:",{"Ref":"AWS::Region"},":*:task/",{"Ref":"EcsCluster97242B84"},"/*"]]}},{"Action":"iam:PassRole","Effect":"Allow","Resource":{"Fn::GetAtt":["TaskDefExecutionRoleB4775C97","Arn"]}}],"Version":"2012-10-17"},"policyName":"TaskDefEventsRoleDefaultPolicyA124E85B","roles":[{"Ref":"TaskDefEventsRoleFB3B67B8"}]}}}}}}}}},"Rule":{"id":"Rule","path":"aws-ecs-integ-ecs/Rule","constructInfo":{"fqn":"aws-cdk-lib.aws_events.Rule","version":"0.0.0","metadata":[{"schedule":"*"},{"addEventPattern":["*"]},{"addTarget":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-ecs/Rule/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_events.CfnRule","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Events::Rule","aws:cdk:cloudformation:props":{"scheduleExpression":"rate(1 minute)","state":"ENABLED","targets":[{"id":"Target0","arn":{"Fn::GetAtt":["EcsCluster97242B84","Arn"]},"roleArn":{"Fn::GetAtt":["TaskDefEventsRoleFB3B67B8","Arn"]},"ecsParameters":{"taskCount":1,"taskDefinitionArn":{"Ref":"TaskDef54694570"},"propagateTags":"TASK_DEFINITION","tagList":[{"key":"my_tag","value":"my_tag_value"}]},"deadLetterConfig":{"arn":{"Fn::GetAtt":["MyDeadLetterQueueD997968A","Arn"]}},"input":"{\"containerOverrides\":[{\"name\":\"TheContainer\",\"environment\":[{\"name\":\"I_WAS_TRIGGERED\",\"value\":\"From CloudWatch Events\"}]}],\"cpu\":\"512\",\"memory\":\"512\"}"}]}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-integ-ecs/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-integ-ecs/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"EcsTest":{"id":"EcsTest","path":"EcsTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"EcsTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"EcsTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"EcsTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"EcsTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"EcsTest/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-lambda-nodejs/test/integ.latest.js.snapshot/LambdaNodeJsLatestIntegDefaultTestDeployAssertD40B5C28.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ.latest.js.snapshot/LambdaNodeJsLatestIntegDefaultTestDeployAssertD40B5C28.assets.json
index 98be46a976d2c..1fe9b2ae56d10 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ.latest.js.snapshot/LambdaNodeJsLatestIntegDefaultTestDeployAssertD40B5C28.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ.latest.js.snapshot/LambdaNodeJsLatestIntegDefaultTestDeployAssertD40B5C28.assets.json
@@ -14,16 +14,16 @@
}
}
},
- "b8f69c1d2a5a2287080f1369036475b33b9b4b0c3a73c8acefed73eb482a6721": {
+ "f1b2f3b2481e15201c6297db2f0067b86a5433fbd495d692c368152b514c809f": {
"displayName": "LambdaNodeJsLatestIntegDefaultTestDeployAssertD40B5C28 Template",
"source": {
"path": "LambdaNodeJsLatestIntegDefaultTestDeployAssertD40B5C28.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region-e99d7266": {
+ "current_account-current_region-79071e9f": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "b8f69c1d2a5a2287080f1369036475b33b9b4b0c3a73c8acefed73eb482a6721.json",
+ "objectKey": "f1b2f3b2481e15201c6297db2f0067b86a5433fbd495d692c368152b514c809f.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ.latest.js.snapshot/LambdaNodeJsLatestIntegDefaultTestDeployAssertD40B5C28.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ.latest.js.snapshot/LambdaNodeJsLatestIntegDefaultTestDeployAssertD40B5C28.template.json
index d733518e3c7e9..5d8bae662b698 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ.latest.js.snapshot/LambdaNodeJsLatestIntegDefaultTestDeployAssertD40B5C28.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ.latest.js.snapshot/LambdaNodeJsLatestIntegDefaultTestDeployAssertD40B5C28.template.json
@@ -27,7 +27,7 @@
}
},
"flattenResponse": "false",
- "salt": "1755535460607"
+ "salt": "1755777740669"
},
"UpdateReplacePolicy": "Delete",
"DeletionPolicy": "Delete"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ.latest.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ.latest.js.snapshot/integ.json
index 2aac7a615ec9b..2f7c6ff035407 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ.latest.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ.latest.js.snapshot/integ.json
@@ -10,5 +10,5 @@
"assertionStackName": "LambdaNodeJsLatestIntegDefaultTestDeployAssertD40B5C28"
}
},
- "minimumCliVersion": "2.1024.0"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ.latest.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ.latest.js.snapshot/manifest.json
index 7ad9c52b0259b..9fecfe841d7bb 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ.latest.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda-nodejs/test/integ.latest.js.snapshot/manifest.json
@@ -143,7 +143,7 @@
"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}/b8f69c1d2a5a2287080f1369036475b33b9b4b0c3a73c8acefed73eb482a6721.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/f1b2f3b2481e15201c6297db2f0067b86a5433fbd495d692c368152b514c809f.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -700,5 +700,5 @@
}
}
},
- "minimumCliVersion": "2.1024.0"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/asset.c74d4e3c82f2db3767a5b28f12d80d3dc43fdb041406fd738e1a754a716b9f96.bundle/index.js b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/asset.4cbd7cdb5600b1d8c000087fcff345214c258e0476ef89eb6b39a89b7de1b656.bundle/index.js
similarity index 99%
rename from packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/asset.c74d4e3c82f2db3767a5b28f12d80d3dc43fdb041406fd738e1a754a716b9f96.bundle/index.js
rename to packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/asset.4cbd7cdb5600b1d8c000087fcff345214c258e0476ef89eb6b39a89b7de1b656.bundle/index.js
index 88bd101dd1246..8d4d540e764d3 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/asset.c74d4e3c82f2db3767a5b28f12d80d3dc43fdb041406fd738e1a754a716b9f96.bundle/index.js
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/asset.4cbd7cdb5600b1d8c000087fcff345214c258e0476ef89eb6b39a89b7de1b656.bundle/index.js
@@ -813,7 +813,7 @@ var init_match = __esm({
var require_helpers_internal = __commonJS({
"../../aws-cdk-lib/assertions/lib/helpers-internal/index.js"(exports2) {
"use strict";
- var __createBinding2 = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {
+ var __createBinding2 = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
if (k2 === void 0)
k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -823,11 +823,11 @@ var require_helpers_internal = __commonJS({
} };
}
Object.defineProperty(o, k2, desc);
- } : function(o, m, k, k2) {
+ }) : (function(o, m, k, k2) {
if (k2 === void 0)
k2 = k;
o[k2] = m[k];
- });
+ }));
var __exportStar2 = exports2 && exports2.__exportStar || function(m, exports3) {
for (var p in m)
if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p))
@@ -12094,7 +12094,7 @@ var init_tslib_es6 = __esm({
};
return __assign.apply(this, arguments);
};
- __createBinding = Object.create ? function(o, m, k, k2) {
+ __createBinding = Object.create ? (function(o, m, k, k2) {
if (k2 === void 0) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
@@ -12103,13 +12103,13 @@ var init_tslib_es6 = __esm({
} };
}
Object.defineProperty(o, k2, desc);
- } : function(o, m, k, k2) {
+ }) : (function(o, m, k, k2) {
if (k2 === void 0) k2 = k;
o[k2] = m[k];
- };
- __setModuleDefault = Object.create ? function(o, v) {
+ });
+ __setModuleDefault = Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
- } : function(o, v) {
+ }) : function(o, v) {
o["default"] = v;
};
ownKeys = function(o) {
@@ -17900,7 +17900,7 @@ var require_dist_cjs49 = __commonJS({
var require_fromWebToken = __commonJS({
"../../../node_modules/@aws-sdk/credential-provider-web-identity/dist-cjs/fromWebToken.js"(exports2) {
"use strict";
- var __createBinding2 = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {
+ var __createBinding2 = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
if (k2 === void 0) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
@@ -17909,13 +17909,13 @@ var require_fromWebToken = __commonJS({
} };
}
Object.defineProperty(o, k2, desc);
- } : function(o, m, k, k2) {
+ }) : (function(o, m, k, k2) {
if (k2 === void 0) k2 = k;
o[k2] = m[k];
- });
- var __setModuleDefault2 = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {
+ }));
+ var __setModuleDefault2 = exports2 && exports2.__setModuleDefault || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
- } : function(o, v) {
+ }) : function(o, v) {
o["default"] = v;
});
var __importStar2 = exports2 && exports2.__importStar || function(mod) {
@@ -23672,9 +23672,9 @@ var require_safer = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/lib/bom-handling.js
+// ../../../node_modules/iconv-lite/lib/bom-handling.js
var require_bom_handling = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/lib/bom-handling.js"(exports2) {
+ "../../../node_modules/iconv-lite/lib/bom-handling.js"(exports2) {
"use strict";
var BOMChar = "\uFEFF";
exports2.PrependBOM = PrependBOMWrapper;
@@ -23716,9 +23716,9 @@ var require_bom_handling = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/internal.js
+// ../../../node_modules/iconv-lite/encodings/internal.js
var require_internal = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/internal.js"(exports2, module2) {
+ "../../../node_modules/iconv-lite/encodings/internal.js"(exports2, module2) {
"use strict";
var Buffer2 = require_safer().Buffer;
module2.exports = {
@@ -23868,9 +23868,9 @@ var require_internal = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/utf32.js
+// ../../../node_modules/iconv-lite/encodings/utf32.js
var require_utf32 = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/utf32.js"(exports2) {
+ "../../../node_modules/iconv-lite/encodings/utf32.js"(exports2) {
"use strict";
var Buffer2 = require_safer().Buffer;
exports2._utf32 = Utf32Codec;
@@ -24087,9 +24087,9 @@ var require_utf32 = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/utf16.js
+// ../../../node_modules/iconv-lite/encodings/utf16.js
var require_utf16 = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/utf16.js"(exports2) {
+ "../../../node_modules/iconv-lite/encodings/utf16.js"(exports2) {
"use strict";
var Buffer2 = require_safer().Buffer;
exports2.utf16be = Utf16BECodec;
@@ -24221,9 +24221,9 @@ var require_utf16 = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/utf7.js
+// ../../../node_modules/iconv-lite/encodings/utf7.js
var require_utf7 = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/utf7.js"(exports2) {
+ "../../../node_modules/iconv-lite/encodings/utf7.js"(exports2) {
"use strict";
var Buffer2 = require_safer().Buffer;
exports2.utf7 = Utf7Codec;
@@ -24422,9 +24422,9 @@ var require_utf7 = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/sbcs-codec.js
+// ../../../node_modules/iconv-lite/encodings/sbcs-codec.js
var require_sbcs_codec = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/sbcs-codec.js"(exports2) {
+ "../../../node_modules/iconv-lite/encodings/sbcs-codec.js"(exports2) {
"use strict";
var Buffer2 = require_safer().Buffer;
exports2._sbcs = SBCSCodec;
@@ -24478,9 +24478,9 @@ var require_sbcs_codec = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/sbcs-data.js
+// ../../../node_modules/iconv-lite/encodings/sbcs-data.js
var require_sbcs_data = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/sbcs-data.js"(exports2, module2) {
+ "../../../node_modules/iconv-lite/encodings/sbcs-data.js"(exports2, module2) {
"use strict";
module2.exports = {
// Not supported by iconv, not sure why.
@@ -24631,9 +24631,9 @@ var require_sbcs_data = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/sbcs-data-generated.js
+// ../../../node_modules/iconv-lite/encodings/sbcs-data-generated.js
var require_sbcs_data_generated = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/sbcs-data-generated.js"(exports2, module2) {
+ "../../../node_modules/iconv-lite/encodings/sbcs-data-generated.js"(exports2, module2) {
"use strict";
module2.exports = {
"437": "cp437",
@@ -25086,9 +25086,9 @@ var require_sbcs_data_generated = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/dbcs-codec.js
+// ../../../node_modules/iconv-lite/encodings/dbcs-codec.js
var require_dbcs_codec = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/dbcs-codec.js"(exports2) {
+ "../../../node_modules/iconv-lite/encodings/dbcs-codec.js"(exports2) {
"use strict";
var Buffer2 = require_safer().Buffer;
exports2._dbcs = DBCSCodec;
@@ -25503,9 +25503,9 @@ var require_dbcs_codec = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/shiftjis.json
+// ../../../node_modules/iconv-lite/encodings/tables/shiftjis.json
var require_shiftjis = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/shiftjis.json"(exports2, module2) {
+ "../../../node_modules/iconv-lite/encodings/tables/shiftjis.json"(exports2, module2) {
module2.exports = [
["0", "\0", 128],
["a1", "\uFF61", 62],
@@ -25634,9 +25634,9 @@ var require_shiftjis = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/eucjp.json
+// ../../../node_modules/iconv-lite/encodings/tables/eucjp.json
var require_eucjp = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/eucjp.json"(exports2, module2) {
+ "../../../node_modules/iconv-lite/encodings/tables/eucjp.json"(exports2, module2) {
module2.exports = [
["0", "\0", 127],
["8ea1", "\uFF61", 62],
@@ -25822,9 +25822,9 @@ var require_eucjp = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/cp936.json
+// ../../../node_modules/iconv-lite/encodings/tables/cp936.json
var require_cp936 = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/cp936.json"(exports2, module2) {
+ "../../../node_modules/iconv-lite/encodings/tables/cp936.json"(exports2, module2) {
module2.exports = [
["0", "\0", 127, "\u20AC"],
["8140", "\u4E02\u4E04\u4E05\u4E06\u4E0F\u4E12\u4E17\u4E1F\u4E20\u4E21\u4E23\u4E26\u4E29\u4E2E\u4E2F\u4E31\u4E33\u4E35\u4E37\u4E3C\u4E40\u4E41\u4E42\u4E44\u4E46\u4E4A\u4E51\u4E55\u4E57\u4E5A\u4E5B\u4E62\u4E63\u4E64\u4E65\u4E67\u4E68\u4E6A", 5, "\u4E72\u4E74", 9, "\u4E7F", 6, "\u4E87\u4E8A"],
@@ -26092,9 +26092,9 @@ var require_cp936 = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/gbk-added.json
+// ../../../node_modules/iconv-lite/encodings/tables/gbk-added.json
var require_gbk_added = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/gbk-added.json"(exports2, module2) {
+ "../../../node_modules/iconv-lite/encodings/tables/gbk-added.json"(exports2, module2) {
module2.exports = [
["a140", "\uE4C6", 62],
["a180", "\uE505", 32],
@@ -26154,16 +26154,16 @@ var require_gbk_added = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json
+// ../../../node_modules/iconv-lite/encodings/tables/gb18030-ranges.json
var require_gb18030_ranges = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json"(exports2, module2) {
+ "../../../node_modules/iconv-lite/encodings/tables/gb18030-ranges.json"(exports2, module2) {
module2.exports = { uChars: [128, 165, 169, 178, 184, 216, 226, 235, 238, 244, 248, 251, 253, 258, 276, 284, 300, 325, 329, 334, 364, 463, 465, 467, 469, 471, 473, 475, 477, 506, 594, 610, 712, 716, 730, 930, 938, 962, 970, 1026, 1104, 1106, 8209, 8215, 8218, 8222, 8231, 8241, 8244, 8246, 8252, 8365, 8452, 8454, 8458, 8471, 8482, 8556, 8570, 8596, 8602, 8713, 8720, 8722, 8726, 8731, 8737, 8740, 8742, 8748, 8751, 8760, 8766, 8777, 8781, 8787, 8802, 8808, 8816, 8854, 8858, 8870, 8896, 8979, 9322, 9372, 9548, 9588, 9616, 9622, 9634, 9652, 9662, 9672, 9676, 9680, 9702, 9735, 9738, 9793, 9795, 11906, 11909, 11913, 11917, 11928, 11944, 11947, 11951, 11956, 11960, 11964, 11979, 12284, 12292, 12312, 12319, 12330, 12351, 12436, 12447, 12535, 12543, 12586, 12842, 12850, 12964, 13200, 13215, 13218, 13253, 13263, 13267, 13270, 13384, 13428, 13727, 13839, 13851, 14617, 14703, 14801, 14816, 14964, 15183, 15471, 15585, 16471, 16736, 17208, 17325, 17330, 17374, 17623, 17997, 18018, 18212, 18218, 18301, 18318, 18760, 18811, 18814, 18820, 18823, 18844, 18848, 18872, 19576, 19620, 19738, 19887, 40870, 59244, 59336, 59367, 59413, 59417, 59423, 59431, 59437, 59443, 59452, 59460, 59478, 59493, 63789, 63866, 63894, 63976, 63986, 64016, 64018, 64021, 64025, 64034, 64037, 64042, 65074, 65093, 65107, 65112, 65127, 65132, 65375, 65510, 65536], gbChars: [0, 36, 38, 45, 50, 81, 89, 95, 96, 100, 103, 104, 105, 109, 126, 133, 148, 172, 175, 179, 208, 306, 307, 308, 309, 310, 311, 312, 313, 341, 428, 443, 544, 545, 558, 741, 742, 749, 750, 805, 819, 820, 7922, 7924, 7925, 7927, 7934, 7943, 7944, 7945, 7950, 8062, 8148, 8149, 8152, 8164, 8174, 8236, 8240, 8262, 8264, 8374, 8380, 8381, 8384, 8388, 8390, 8392, 8393, 8394, 8396, 8401, 8406, 8416, 8419, 8424, 8437, 8439, 8445, 8482, 8485, 8496, 8521, 8603, 8936, 8946, 9046, 9050, 9063, 9066, 9076, 9092, 9100, 9108, 9111, 9113, 9131, 9162, 9164, 9218, 9219, 11329, 11331, 11334, 11336, 11346, 11361, 11363, 11366, 11370, 11372, 11375, 11389, 11682, 11686, 11687, 11692, 11694, 11714, 11716, 11723, 11725, 11730, 11736, 11982, 11989, 12102, 12336, 12348, 12350, 12384, 12393, 12395, 12397, 12510, 12553, 12851, 12962, 12973, 13738, 13823, 13919, 13933, 14080, 14298, 14585, 14698, 15583, 15847, 16318, 16434, 16438, 16481, 16729, 17102, 17122, 17315, 17320, 17402, 17418, 17859, 17909, 17911, 17915, 17916, 17936, 17939, 17961, 18664, 18703, 18814, 18962, 19043, 33469, 33470, 33471, 33484, 33485, 33490, 33497, 33501, 33505, 33513, 33520, 33536, 33550, 37845, 37921, 37948, 38029, 38038, 38064, 38065, 38066, 38069, 38075, 38076, 38078, 39108, 39109, 39113, 39114, 39115, 39116, 39265, 39394, 189e3] };
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/cp949.json
+// ../../../node_modules/iconv-lite/encodings/tables/cp949.json
var require_cp949 = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/cp949.json"(exports2, module2) {
+ "../../../node_modules/iconv-lite/encodings/tables/cp949.json"(exports2, module2) {
module2.exports = [
["0", "\0", 127],
["8141", "\uAC02\uAC03\uAC05\uAC06\uAC0B", 4, "\uAC18\uAC1E\uAC1F\uAC21\uAC22\uAC23\uAC25", 6, "\uAC2E\uAC32\uAC33\uAC34"],
@@ -26440,9 +26440,9 @@ var require_cp949 = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/cp950.json
+// ../../../node_modules/iconv-lite/encodings/tables/cp950.json
var require_cp950 = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/cp950.json"(exports2, module2) {
+ "../../../node_modules/iconv-lite/encodings/tables/cp950.json"(exports2, module2) {
module2.exports = [
["0", "\0", 127],
["a140", "\u3000\uFF0C\u3001\u3002\uFF0E\u2027\uFF1B\uFF1A\uFF1F\uFF01\uFE30\u2026\u2025\uFE50\uFE51\uFE52\xB7\uFE54\uFE55\uFE56\uFE57\uFF5C\u2013\uFE31\u2014\uFE33\u2574\uFE34\uFE4F\uFF08\uFF09\uFE35\uFE36\uFF5B\uFF5D\uFE37\uFE38\u3014\u3015\uFE39\uFE3A\u3010\u3011\uFE3B\uFE3C\u300A\u300B\uFE3D\uFE3E\u3008\u3009\uFE3F\uFE40\u300C\u300D\uFE41\uFE42\u300E\u300F\uFE43\uFE44\uFE59\uFE5A"],
@@ -26623,9 +26623,9 @@ var require_cp950 = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/big5-added.json
+// ../../../node_modules/iconv-lite/encodings/tables/big5-added.json
var require_big5_added = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/tables/big5-added.json"(exports2, module2) {
+ "../../../node_modules/iconv-lite/encodings/tables/big5-added.json"(exports2, module2) {
module2.exports = [
["8740", "\u43F0\u4C32\u4603\u45A6\u4578\u{27267}\u4D77\u45B3\u{27CB1}\u4CE2\u{27CC5}\u3B95\u4736\u4744\u4C47\u4C40\u{242BF}\u{23617}\u{27352}\u{26E8B}\u{270D2}\u4C57\u{2A351}\u474F\u45DA\u4C85\u{27C6C}\u4D07\u4AA4\u46A1\u{26B23}\u7225\u{25A54}\u{21A63}\u{23E06}\u{23F61}\u664D\u56FB"],
["8767", "\u7D95\u591D\u{28BB9}\u3DF4\u9734\u{27BEF}\u5BDB\u{21D5E}\u5AA4\u3625\u{29EB0}\u5AD1\u5BB7\u5CFC\u676E\u8593\u{29945}\u7461\u749D\u3875\u{21D53}\u{2369E}\u{26021}\u3EEC"],
@@ -26751,9 +26751,9 @@ var require_big5_added = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/dbcs-data.js
+// ../../../node_modules/iconv-lite/encodings/dbcs-data.js
var require_dbcs_data = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/dbcs-data.js"(exports2, module2) {
+ "../../../node_modules/iconv-lite/encodings/dbcs-data.js"(exports2, module2) {
"use strict";
module2.exports = {
// == Japanese/ShiftJIS ====================================================
@@ -26998,9 +26998,9 @@ var require_dbcs_data = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/encodings/index.js
+// ../../../node_modules/iconv-lite/encodings/index.js
var require_encodings = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/encodings/index.js"(exports2, module2) {
+ "../../../node_modules/iconv-lite/encodings/index.js"(exports2, module2) {
"use strict";
var modules = [
require_internal(),
@@ -27025,9 +27025,9 @@ var require_encodings = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/lib/streams.js
+// ../../../node_modules/iconv-lite/lib/streams.js
var require_streams = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/lib/streams.js"(exports2, module2) {
+ "../../../node_modules/iconv-lite/lib/streams.js"(exports2, module2) {
"use strict";
var Buffer2 = require_safer().Buffer;
module2.exports = function(stream_module) {
@@ -27120,9 +27120,9 @@ var require_streams = __commonJS({
}
});
-// ../../../node_modules/encoding/node_modules/iconv-lite/lib/index.js
+// ../../../node_modules/iconv-lite/lib/index.js
var require_lib2 = __commonJS({
- "../../../node_modules/encoding/node_modules/iconv-lite/lib/index.js"(exports2, module2) {
+ "../../../node_modules/iconv-lite/lib/index.js"(exports2, module2) {
"use strict";
var Buffer2 = require_safer().Buffer;
var bomHandling = require_bom_handling();
@@ -30215,7 +30215,7 @@ var init_api_call = __esm({
var require_lib4 = __commonJS({
"../aws-custom-resource-sdk-adapter/lib/index.js"(exports2) {
"use strict";
- var __createBinding2 = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {
+ var __createBinding2 = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
if (k2 === void 0) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
@@ -30224,10 +30224,10 @@ var require_lib4 = __commonJS({
} };
}
Object.defineProperty(o, k2, desc);
- } : function(o, m, k, k2) {
+ }) : (function(o, m, k, k2) {
if (k2 === void 0) k2 = k;
o[k2] = m[k];
- });
+ }));
var __exportStar2 = exports2 && exports2.__exportStar || function(m, exports3) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding2(exports3, m, p);
};
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/aws-cdk-ecs-run-task-ec2-schedule.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/aws-cdk-ecs-run-task-ec2-schedule.assets.json
index 39f0a35922a83..fa6d9b36b7eca 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/aws-cdk-ecs-run-task-ec2-schedule.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/aws-cdk-ecs-run-task-ec2-schedule.assets.json
@@ -15,16 +15,16 @@
}
}
},
- "741c5faeb0d56dbbf6c591130c6cd9eaac987ce5bfe0373dfd4200259f8545d4": {
+ "e8909aa4be5d06e0cc88cc9d4a26d54028be24e9b4a02cb20935179191e8d538": {
"displayName": "aws-cdk-ecs-run-task-ec2-schedule Template",
"source": {
"path": "aws-cdk-ecs-run-task-ec2-schedule.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region-e1493eb0": {
+ "current_account-current_region-ea1f5af0": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "741c5faeb0d56dbbf6c591130c6cd9eaac987ce5bfe0373dfd4200259f8545d4.json",
+ "objectKey": "e8909aa4be5d06e0cc88cc9d4a26d54028be24e9b4a02cb20935179191e8d538.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/aws-cdk-ecs-run-task-ec2-schedule.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/aws-cdk-ecs-run-task-ec2-schedule.template.json
index 76b5b08e33e8a..20baa3873cb5b 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/aws-cdk-ecs-run-task-ec2-schedule.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/aws-cdk-ecs-run-task-ec2-schedule.template.json
@@ -708,7 +708,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -724,7 +724,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/integ.json
index 566af4f200ec4..4a6c3fe8d9f47 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/integ.json
@@ -10,5 +10,5 @@
"assertionStackName": "integecsruntaskec2DefaultTestDeployAssert078FB53C"
}
},
- "minimumCliVersion": "2.1023.0"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/integecsruntaskec2DefaultTestDeployAssert078FB53C.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/integecsruntaskec2DefaultTestDeployAssert078FB53C.assets.json
index 401d7f1de39ce..0408528b09896 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/integecsruntaskec2DefaultTestDeployAssert078FB53C.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/integecsruntaskec2DefaultTestDeployAssert078FB53C.assets.json
@@ -1,29 +1,29 @@
{
"version": "48.0.0",
"files": {
- "c74d4e3c82f2db3767a5b28f12d80d3dc43fdb041406fd738e1a754a716b9f96": {
+ "4cbd7cdb5600b1d8c000087fcff345214c258e0476ef89eb6b39a89b7de1b656": {
"source": {
- "path": "asset.c74d4e3c82f2db3767a5b28f12d80d3dc43fdb041406fd738e1a754a716b9f96.bundle",
+ "path": "asset.4cbd7cdb5600b1d8c000087fcff345214c258e0476ef89eb6b39a89b7de1b656.bundle",
"packaging": "zip"
},
"destinations": {
- "current_account-current_region-ad46d999": {
+ "current_account-current_region-767d8bdc": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "c74d4e3c82f2db3767a5b28f12d80d3dc43fdb041406fd738e1a754a716b9f96.zip",
+ "objectKey": "4cbd7cdb5600b1d8c000087fcff345214c258e0476ef89eb6b39a89b7de1b656.zip",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
},
- "72a3bc2f02874d4e176a489081bbed5a57ba84f849cf2774b90a963768bd98ba": {
+ "c1dcc1a2bae99ce2443b70072badd7b31d52dfc0d9504f52be0976d3f4ab2d55": {
"displayName": "integecsruntaskec2DefaultTestDeployAssert078FB53C Template",
"source": {
"path": "integecsruntaskec2DefaultTestDeployAssert078FB53C.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region-bbd1a832": {
+ "current_account-current_region-532acb72": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "72a3bc2f02874d4e176a489081bbed5a57ba84f849cf2774b90a963768bd98ba.json",
+ "objectKey": "c1dcc1a2bae99ce2443b70072badd7b31d52dfc0d9504f52be0976d3f4ab2d55.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/integecsruntaskec2DefaultTestDeployAssert078FB53C.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/integecsruntaskec2DefaultTestDeployAssert078FB53C.template.json
index 648c9805acad2..df44fbcf922d7 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/integecsruntaskec2DefaultTestDeployAssert078FB53C.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/integecsruntaskec2DefaultTestDeployAssert078FB53C.template.json
@@ -35,7 +35,7 @@
"taskArns.0",
"taskArns.0"
],
- "salt": "1754404171588"
+ "salt": "1755777737413"
},
"UpdateReplacePolicy": "Delete",
"DeletionPolicy": "Delete"
@@ -242,7 +242,7 @@
"S3Bucket": {
"Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"
},
- "S3Key": "c74d4e3c82f2db3767a5b28f12d80d3dc43fdb041406fd738e1a754a716b9f96.zip"
+ "S3Key": "4cbd7cdb5600b1d8c000087fcff345214c258e0476ef89eb6b39a89b7de1b656.zip"
},
"Timeout": 120,
"Handler": "index.handler",
@@ -312,7 +312,7 @@
"S3Bucket": {
"Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"
},
- "S3Key": "c74d4e3c82f2db3767a5b28f12d80d3dc43fdb041406fd738e1a754a716b9f96.zip"
+ "S3Key": "4cbd7cdb5600b1d8c000087fcff345214c258e0476ef89eb6b39a89b7de1b656.zip"
},
"Timeout": 120,
"Handler": "index.isComplete",
@@ -354,7 +354,7 @@
"S3Bucket": {
"Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"
},
- "S3Key": "c74d4e3c82f2db3767a5b28f12d80d3dc43fdb041406fd738e1a754a716b9f96.zip"
+ "S3Key": "4cbd7cdb5600b1d8c000087fcff345214c258e0476ef89eb6b39a89b7de1b656.zip"
},
"Timeout": 120,
"Handler": "index.onTimeout",
@@ -407,7 +407,7 @@
}
},
"flattenResponse": "false",
- "salt": "1754404171593"
+ "salt": "1755777737419"
},
"UpdateReplacePolicy": "Delete",
"DeletionPolicy": "Delete"
@@ -457,7 +457,7 @@
}
},
"flattenResponse": "false",
- "salt": "1754404171593"
+ "salt": "1755777737419"
},
"UpdateReplacePolicy": "Delete",
"DeletionPolicy": "Delete"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/manifest.json
index 78a45d765334b..ef8ae6de60ba5 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/manifest.json
@@ -18,7 +18,7 @@
"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}/741c5faeb0d56dbbf6c591130c6cd9eaac987ce5bfe0373dfd4200259f8545d4.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/e8909aa4be5d06e0cc88cc9d4a26d54028be24e9b4a02cb20935179191e8d538.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1054,7 +1054,7 @@
"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}/72a3bc2f02874d4e176a489081bbed5a57ba84f849cf2774b90a963768bd98ba.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/c1dcc1a2bae99ce2443b70072badd7b31d52dfc0d9504f52be0976d3f4ab2d55.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1253,19 +1253,9 @@
"properties": {
"module": "aws-cdk-lib",
"flags": {
- "@aws-cdk/core:enableStackNameDuplicates": {
+ "@aws-cdk/aws-signer:signingProfileNamePassedToCfn": {
"recommendedValue": true,
- "explanation": "Allow multiple stacks with the same name",
- "unconfiguredBehavesLike": {
- "v2": true
- }
- },
- "aws-cdk:enableDiffNoFail": {
- "recommendedValue": true,
- "explanation": "Make `cdk diff` not fail when there are differences",
- "unconfiguredBehavesLike": {
- "v2": true
- }
+ "explanation": "Pass signingProfileName to CfnSigningProfile"
},
"@aws-cdk/core:newStyleStackSynthesis": {
"recommendedValue": true,
@@ -1281,41 +1271,6 @@
"v2": true
}
},
- "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": {
- "recommendedValue": true,
- "explanation": "DockerImageAsset properly supports `.dockerignore` files by default",
- "unconfiguredBehavesLike": {
- "v2": true
- }
- },
- "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": {
- "recommendedValue": true,
- "explanation": "Fix the referencing of SecretsManager names from ARNs",
- "unconfiguredBehavesLike": {
- "v2": true
- }
- },
- "@aws-cdk/aws-kms:defaultKeyPolicies": {
- "recommendedValue": true,
- "explanation": "Tighten default KMS key policies",
- "unconfiguredBehavesLike": {
- "v2": true
- }
- },
- "@aws-cdk/aws-s3:grantWriteWithoutAcl": {
- "recommendedValue": true,
- "explanation": "Remove `PutObjectAcl` from Bucket.grantWrite",
- "unconfiguredBehavesLike": {
- "v2": true
- }
- },
- "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
- "recommendedValue": true,
- "explanation": "Do not specify a default DesiredCount for ECS services",
- "unconfiguredBehavesLike": {
- "v2": true
- }
- },
"@aws-cdk/aws-rds:lowercaseDbIdentifier": {
"recommendedValue": true,
"explanation": "Force lowercasing of RDS Cluster names in CDK",
@@ -1330,13 +1285,6 @@
"v2": true
}
},
- "@aws-cdk/aws-efs:defaultEncryptionAtRest": {
- "recommendedValue": true,
- "explanation": "Enable this feature flag to have elastic file systems encrypted at rest by default.",
- "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`.",
@@ -1733,10 +1681,7 @@
},
"@aws-cdk/cognito:logUserPoolClientSecretValue": {
"recommendedValue": false,
- "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs.",
- "unconfiguredBehavesLike": {
- "v2": false
- }
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
},
"@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
"recommendedValue": true,
@@ -1762,10 +1707,7 @@
},
"@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
"recommendedValue": false,
- "explanation": "When enabled, use resource IDs for VPC V2 migration",
- "unconfiguredBehavesLike": {
- "v2": false
- }
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
},
"@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
"userValue": true,
@@ -1775,14 +1717,11 @@
"@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
"userValue": false,
"recommendedValue": true,
- "explanation": "When enabled, CDK creates and manages loggroup for the lambda function",
- "unconfiguredBehavesLike": {
- "v2": false
- }
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
}
}
}
}
},
- "minimumCliVersion": "2.1023.0"
+ "minimumCliVersion": "2.1025.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/tree.json
index f59a86da8ede8..80acffb4203f6 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-scheduler-targets/test/integ.ecs-run-task-ec2.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-run-task-ec2-schedule":{"id":"aws-cdk-ecs-run-task-ec2-schedule","path":"aws-cdk-ecs-run-task-ec2-schedule","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-cdk-ecs-run-task-ec2-schedule/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/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-run-task-ec2-schedule/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-cdk-ecs-run-task-ec2-schedule/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-run-task-ec2-schedule/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/17","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-cdk-ecs-run-task-ec2-schedule/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-ecs-run-task-ec2-schedule/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-run-task-ec2-schedule/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-ecs-run-task-ec2-schedule/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-cdk-ecs-run-task-ec2-schedule/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-cdk-ecs-run-task-ec2-schedule/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-run-task-ec2-schedule/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-cdk-ecs-run-task-ec2-schedule/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/Vpc/PublicSubnet1"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-cdk-ecs-run-task-ec2-schedule/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-run-task-ec2-schedule/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/17","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-cdk-ecs-run-task-ec2-schedule/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-ecs-run-task-ec2-schedule/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-run-task-ec2-schedule/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-ecs-run-task-ec2-schedule/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-cdk-ecs-run-task-ec2-schedule/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"IGW":{"id":"IGW","path":"aws-cdk-ecs-run-task-ec2-schedule/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-run-task-ec2-schedule/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-cdk-ecs-run-task-ec2-schedule/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"aws-cdk-ecs-run-task-ec2-schedule/Vpc/RestrictDefaultSecurityGroupCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"aws-cdk-ecs-run-task-ec2-schedule/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"aws-cdk-ecs-run-task-ec2-schedule/Custom::VpcRestrictDefaultSGCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-cdk-ecs-run-task-ec2-schedule/Custom::VpcRestrictDefaultSGCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"aws-cdk-ecs-run-task-ec2-schedule/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"aws-cdk-ecs-run-task-ec2-schedule/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Ec2Cluster":{"id":"Ec2Cluster","path":"aws-cdk-ecs-run-task-ec2-schedule/Ec2Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addAsgCapacityProvider":["*"]}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/Ec2Cluster/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":{}}},"Ec2Cluster":{"id":"Ec2Cluster","path":"aws-cdk-ecs-run-task-ec2-schedule/Ec2Cluster/Ec2Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"Ref":"EC2CapacityProvider5A2E35CD"}],"cluster":{"Ref":"Ec2ClusterEE43E89D"},"defaultCapacityProviderStrategy":[]}}}}},"ASG":{"id":"ASG","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","instanceType":"*","machineImage":"*","vpcSubnets":{"subnetType":"Public"},"associatePublicIpAddress":true},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/ASG"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/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":["Ec2ClusterEE43E89D","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ASGInstanceRoleDefaultPolicy7636D8BF","roles":[{"Ref":"ASGInstanceRoleE263A41B"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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":"ASGInstanceRoleE263A41B"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/LaunchTemplate","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.LaunchTemplate","version":"0.0.0","metadata":[{"machineImage":"*","instanceType":"*","detailedMonitoring":false,"securityGroup":"*","userData":"*","associatePublicIpAddress":true,"spotOptions":"*","blockDevices":"*","instanceProfile":"*","keyPair":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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":["ASGInstanceProfile0A2834D7","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/ASG/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/ASG/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"Ec2ClusterEE43E89D"}," >> /etc/ecs/ecs.config"]]}},"networkInterfaces":[{"deviceIndex":0,"associatePublicIpAddress":true,"groups":[{"Fn::GetAtt":["ASGInstanceSecurityGroup0525485D","GroupId"]}]}]},"tagSpecifications":[{"resourceType":"launch-template","tags":[{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/ASG/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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":"ASGLaunchTemplate0CA92847"},"version":{"Fn::GetAtt":["ASGLaunchTemplate0CA92847","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/ASG","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/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":"ASG46ED3070"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]}}],"Version":"2012-10-17"},"policyName":"ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27","roles":[{"Ref":"ASGDrainECSHookFunctionServiceRoleC12963BB"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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('Got event without EC2InstanceId: %s', 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":"Ec2ClusterEE43E89D"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ASGDrainECSHookFunctionServiceRoleC12963BB","Arn"]},"runtime":"python3.9","tags":[{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/ASG"}],"timeout":310}}},"AllowInvoke:awscdkecsruntaskec2scheduleASGLifecycleHookDrainHookTopicBEC3ABFA":{"id":"AllowInvoke:awscdkecsruntaskec2scheduleASGLifecycleHookDrainHookTopicBEC3ABFA","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/DrainECSHook/Function/AllowInvoke:awscdkecsruntaskec2scheduleASGLifecycleHookDrainHookTopicBEC3ABFA","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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}},"Topic":{"id":"Topic","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG"}]}}}}},"Role":{"id":"Role","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/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":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}],"Version":"2012-10-17"},"policyName":"ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57","roles":[{"Ref":"ASGLifecycleHookDrainHookRoleD640316C"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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":"ASG46ED3070"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"},"roleArn":{"Fn::GetAtt":["ASGLifecycleHookDrainHookRoleD640316C","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-run-task-ec2-schedule/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-run-task-ec2-schedule/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":[]}},"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"aws-cdk-ecs-run-task-ec2-schedule/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.AsgCapacityProvider","version":"0.0.0"},"children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"aws-cdk-ecs-run-task-ec2-schedule/EC2CapacityProvider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCapacityProvider","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::CapacityProvider","aws:cdk:cloudformation:props":{"autoScalingGroupProvider":{"autoScalingGroupArn":{"Ref":"ASG46ED3070"},"managedScaling":{"status":"ENABLED","targetCapacity":100},"managedTerminationProtection":"DISABLED"},"name":"cp-aws-cdk-ecs-run-task-ec2-scheduleEC2CapacityProvider571EF93B"}}}}},"Ec2TaskDefinition":{"id":"Ec2TaskDefinition","path":"aws-cdk-ecs-run-task-ec2-schedule/Ec2TaskDefinition","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-cdk-ecs-run-task-ec2-schedule/Ec2TaskDefinition/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-run-task-ec2-schedule/Ec2TaskDefinition/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/Ec2TaskDefinition/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-run-task-ec2-schedule/Ec2TaskDefinition/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":"ScheduledContainer"}],"family":"awscdkecsruntaskec2scheduleEc2TaskDefinition4AC2BDA6","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["Ec2TaskDefinitionTaskRole0B78BC85","Arn"]}}}},"ScheduledContainer":{"id":"ScheduledContainer","path":"aws-cdk-ecs-run-task-ec2-schedule/Ec2TaskDefinition/ScheduledContainer","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"Schedule":{"id":"Schedule","path":"aws-cdk-ecs-run-task-ec2-schedule/Schedule","constructInfo":{"fqn":"aws-cdk-lib.aws_scheduler.Schedule","version":"0.0.0","metadata":[{"schedule":"*","target":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/Schedule/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_scheduler.CfnSchedule","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Scheduler::Schedule","aws:cdk:cloudformation:props":{"flexibleTimeWindow":{"mode":"OFF"},"scheduleExpression":"rate(30 minutes)","scheduleExpressionTimezone":"Etc/UTC","state":"ENABLED","target":{"arn":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]},"roleArn":{"Fn::GetAtt":["SchedulerRoleForTarget8b3a82594BF5FC","Arn"]},"retryPolicy":{"maximumEventAgeInSeconds":86400,"maximumRetryAttempts":185},"ecsParameters":{"taskDefinitionArn":{"Ref":"Ec2TaskDefinitionB25030BE"},"capacityProviderStrategy":[{"capacityProvider":{"Ref":"EC2CapacityProvider5A2E35CD"},"weight":1,"base":1}],"tags":[{"key":"integ-test-tag-key","value":"integ-test-tag-value"}],"propagateTags":"TASK_DEFINITION"}}}}}}},"SchedulerRoleForTarget-8b3a82":{"id":"SchedulerRoleForTarget-8b3a82","path":"aws-cdk-ecs-run-task-ec2-schedule/SchedulerRoleForTarget-8b3a82","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportSchedulerRoleForTarget-8b3a82":{"id":"ImportSchedulerRoleForTarget-8b3a82","path":"aws-cdk-ecs-run-task-ec2-schedule/SchedulerRoleForTarget-8b3a82/ImportSchedulerRoleForTarget-8b3a82","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/SchedulerRoleForTarget-8b3a82/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","Condition":{"StringEquals":{"aws:SourceAccount":{"Ref":"AWS::AccountId"},"aws:SourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":scheduler:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":schedule-group/default"]]}}},"Effect":"Allow","Principal":{"Service":"scheduler.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-ecs-run-task-ec2-schedule/SchedulerRoleForTarget-8b3a82/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/SchedulerRoleForTarget-8b3a82/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":"iam:PassRole","Condition":{"StringLike":{"iam:PassedToService":"ecs-tasks.amazonaws.com"}},"Effect":"Allow","Resource":{"Fn::GetAtt":["Ec2TaskDefinitionTaskRole0B78BC85","Arn"]}},{"Action":"ecs:RunTask","Effect":"Allow","Resource":{"Ref":"Ec2TaskDefinitionB25030BE"}},{"Action":"ecs:TagResource","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":task/",{"Ref":"Ec2ClusterEE43E89D"},"/*"]]}}],"Version":"2012-10-17"},"policyName":"SchedulerRoleForTarget8b3a82DefaultPolicyB532E009","roles":[{"Ref":"SchedulerRoleForTarget8b3a82594BF5FC"}]}}}}}}},"Exports":{"id":"Exports","path":"aws-cdk-ecs-run-task-ec2-schedule/Exports","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Output{\"Fn::GetAtt\":[\"Ec2ClusterEE43E89D\",\"Arn\"]}":{"id":"Output{\"Fn::GetAtt\":[\"Ec2ClusterEE43E89D\",\"Arn\"]}","path":"aws-cdk-ecs-run-task-ec2-schedule/Exports/Output{\"Fn::GetAtt\":[\"Ec2ClusterEE43E89D\",\"Arn\"]}","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-cdk-ecs-run-task-ec2-schedule/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-cdk-ecs-run-task-ec2-schedule/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"integ-ecs-run-task-ec2":{"id":"integ-ecs-run-task-ec2","path":"integ-ecs-run-task-ec2","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"integ-ecs-run-task-ec2/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"integ-ecs-run-task-ec2/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684":{"id":"AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"},"children":{"SdkProvider":{"id":"SdkProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/SdkProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}},"Default":{"id":"Default","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/Default","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"Default":{"id":"Default","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/Default/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"WaitFor":{"id":"WaitFor","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"},"children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/IsCompleteProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"TimeoutProvider":{"id":"TimeoutProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/TimeoutProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Role":{"id":"Role","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Resource":{"id":"Resource","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/Resource","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"AssertionResults":{"id":"AssertionResults","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/AssertionResults","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}}}},"SingletonFunction1488541a7b23466481b69b4408076b81":{"id":"SingletonFunction1488541a7b23466481b69b4408076b81","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Staging":{"id":"Staging","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"SingletonFunction76b3e830a873425f8453eddd85c86925":{"id":"SingletonFunction76b3e830a873425f8453eddd85c86925","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Staging":{"id":"Staging","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a":{"id":"SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Staging":{"id":"Staging","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"AwsApiCallECSstopTask057e432cca615475289dd5332b83dc97":{"id":"AwsApiCallECSstopTask057e432cca615475289dd5332b83dc97","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSstopTask057e432cca615475289dd5332b83dc97","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"},"children":{"SdkProvider":{"id":"SdkProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSstopTask057e432cca615475289dd5332b83dc97/SdkProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSstopTask057e432cca615475289dd5332b83dc97/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}},"Default":{"id":"Default","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSstopTask057e432cca615475289dd5332b83dc97/Default","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSstopTask057e432cca615475289dd5332b83dc97/Default/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38":{"id":"AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"},"children":{"SdkProvider":{"id":"SdkProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/SdkProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}},"Default":{"id":"Default","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/Default","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*","*","*"]},"children":{"Default":{"id":"Default","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/Default/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"WaitFor":{"id":"WaitFor","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"},"children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/IsCompleteProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"TimeoutProvider":{"id":"TimeoutProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/TimeoutProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Role":{"id":"Role","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Resource":{"id":"Resource","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/Resource","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"AssertionResults":{"id":"AssertionResults","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/AssertionResults","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"integ-ecs-run-task-ec2/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
+{"version":"tree-0.1","tree":{"id":"App","path":"","constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.0.0"},"children":{"aws-cdk-ecs-run-task-ec2-schedule":{"id":"aws-cdk-ecs-run-task-ec2-schedule","path":"aws-cdk-ecs-run-task-ec2-schedule","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Vpc":{"id":"Vpc","path":"aws-cdk-ecs-run-task-ec2-schedule/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/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-run-task-ec2-schedule/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-cdk-ecs-run-task-ec2-schedule/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-run-task-ec2-schedule/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/17","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-cdk-ecs-run-task-ec2-schedule/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-ecs-run-task-ec2-schedule/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-run-task-ec2-schedule/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-ecs-run-task-ec2-schedule/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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-cdk-ecs-run-task-ec2-schedule/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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}}},"EIP":{"id":"EIP","path":"aws-cdk-ecs-run-task-ec2-schedule/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-run-task-ec2-schedule/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-cdk-ecs-run-task-ec2-schedule/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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"tags":[{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/Vpc/PublicSubnet1"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-cdk-ecs-run-task-ec2-schedule/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-run-task-ec2-schedule/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/17","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"Acl":{"id":"Acl","path":"aws-cdk-ecs-run-task-ec2-schedule/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-ecs-run-task-ec2-schedule/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-run-task-ec2-schedule/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-ecs-run-task-ec2-schedule/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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-cdk-ecs-run-task-ec2-schedule/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":"VpcPublicSubnet1NATGateway4D7517AA"},"routeTableId":{"Ref":"VpcPrivateSubnet1RouteTableB2C5B500"}}}}}},"IGW":{"id":"IGW","path":"aws-cdk-ecs-run-task-ec2-schedule/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-run-task-ec2-schedule/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-cdk-ecs-run-task-ec2-schedule/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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"aws-cdk-ecs-run-task-ec2-schedule/Vpc/RestrictDefaultSecurityGroupCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"aws-cdk-ecs-run-task-ec2-schedule/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"aws-cdk-ecs-run-task-ec2-schedule/Custom::VpcRestrictDefaultSGCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-cdk-ecs-run-task-ec2-schedule/Custom::VpcRestrictDefaultSGCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"aws-cdk-ecs-run-task-ec2-schedule/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"aws-cdk-ecs-run-task-ec2-schedule/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Ec2Cluster":{"id":"Ec2Cluster","path":"aws-cdk-ecs-run-task-ec2-schedule/Ec2Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"vpc":"*"},{"addAsgCapacityProvider":["*"]}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/Ec2Cluster/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":{}}},"Ec2Cluster":{"id":"Ec2Cluster","path":"aws-cdk-ecs-run-task-ec2-schedule/Ec2Cluster/Ec2Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnClusterCapacityProviderAssociations","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"Ref":"EC2CapacityProvider5A2E35CD"}],"cluster":{"Ref":"Ec2ClusterEE43E89D"},"defaultCapacityProviderStrategy":[]}}}}},"ASG":{"id":"ASG","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","instanceType":"*","machineImage":"*","vpcSubnets":{"subnetType":"Public"},"associatePublicIpAddress":true},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/ASG"}],"vpcId":{"Ref":"Vpc8378EB38"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/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":["Ec2ClusterEE43E89D","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ASGInstanceRoleDefaultPolicy7636D8BF","roles":[{"Ref":"ASGInstanceRoleE263A41B"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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":"ASGInstanceRoleE263A41B"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/LaunchTemplate","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.LaunchTemplate","version":"0.0.0","metadata":[{"machineImage":"*","instanceType":"*","detailedMonitoring":false,"securityGroup":"*","userData":"*","associatePublicIpAddress":true,"spotOptions":"*","blockDevices":"*","instanceProfile":"*","keyPair":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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":["ASGInstanceProfile0A2834D7","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/ASG/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/ASG/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"Ec2ClusterEE43E89D"}," >> /etc/ecs/ecs.config"]]}},"networkInterfaces":[{"deviceIndex":0,"associatePublicIpAddress":true,"groups":[{"Fn::GetAtt":["ASGInstanceSecurityGroup0525485D","GroupId"]}]}]},"tagSpecifications":[{"resourceType":"launch-template","tags":[{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/ASG/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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":"ASGLaunchTemplate0CA92847"},"version":{"Fn::GetAtt":["ASGLaunchTemplate0CA92847","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/ASG","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/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":"ASG46ED3070"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]}}],"Version":"2012-10-17"},"policyName":"ASGDrainECSHookFunctionServiceRoleDefaultPolicy16848A27","roles":[{"Ref":"ASGDrainECSHookFunctionServiceRoleC12963BB"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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":"Ec2ClusterEE43E89D"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["ASGDrainECSHookFunctionServiceRoleC12963BB","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-cdk-ecs-run-task-ec2-schedule/ASG"}],"timeout":310}}},"AllowInvoke:awscdkecsruntaskec2scheduleASGLifecycleHookDrainHookTopicBEC3ABFA":{"id":"AllowInvoke:awscdkecsruntaskec2scheduleASGLifecycleHookDrainHookTopicBEC3ABFA","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/DrainECSHook/Function/AllowInvoke:awscdkecsruntaskec2scheduleASGLifecycleHookDrainHookTopicBEC3ABFA","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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}},"Topic":{"id":"Topic","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/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":["ASGDrainECSHookFunction5F24CF4D","Arn"]},"protocol":"lambda","topicArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG"}]}}}}},"Role":{"id":"Role","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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-run-task-ec2-schedule/ASG/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":"ASGLifecycleHookDrainHookTopicA8AD4ACB"}}],"Version":"2012-10-17"},"policyName":"ASGLifecycleHookDrainHookRoleDefaultPolicy3EEFDE57","roles":[{"Ref":"ASGLifecycleHookDrainHookRoleD640316C"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/ASG/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":"ASG46ED3070"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"ASGLifecycleHookDrainHookTopicA8AD4ACB"},"roleArn":{"Fn::GetAtt":["ASGLifecycleHookDrainHookRoleD640316C","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-run-task-ec2-schedule/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-run-task-ec2-schedule/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":[]}},"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"aws-cdk-ecs-run-task-ec2-schedule/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.AsgCapacityProvider","version":"0.0.0"},"children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"aws-cdk-ecs-run-task-ec2-schedule/EC2CapacityProvider/EC2CapacityProvider","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCapacityProvider","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::CapacityProvider","aws:cdk:cloudformation:props":{"autoScalingGroupProvider":{"autoScalingGroupArn":{"Ref":"ASG46ED3070"},"managedScaling":{"status":"ENABLED","targetCapacity":100},"managedTerminationProtection":"DISABLED"},"name":"cp-aws-cdk-ecs-run-task-ec2-scheduleEC2CapacityProvider571EF93B"}}}}},"Ec2TaskDefinition":{"id":"Ec2TaskDefinition","path":"aws-cdk-ecs-run-task-ec2-schedule/Ec2TaskDefinition","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-cdk-ecs-run-task-ec2-schedule/Ec2TaskDefinition/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-run-task-ec2-schedule/Ec2TaskDefinition/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/Ec2TaskDefinition/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-run-task-ec2-schedule/Ec2TaskDefinition/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":"ScheduledContainer"}],"family":"awscdkecsruntaskec2scheduleEc2TaskDefinition4AC2BDA6","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["Ec2TaskDefinitionTaskRole0B78BC85","Arn"]}}}},"ScheduledContainer":{"id":"ScheduledContainer","path":"aws-cdk-ecs-run-task-ec2-schedule/Ec2TaskDefinition/ScheduledContainer","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"}}}},"Schedule":{"id":"Schedule","path":"aws-cdk-ecs-run-task-ec2-schedule/Schedule","constructInfo":{"fqn":"aws-cdk-lib.aws_scheduler.Schedule","version":"0.0.0","metadata":[{"schedule":"*","target":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/Schedule/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_scheduler.CfnSchedule","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Scheduler::Schedule","aws:cdk:cloudformation:props":{"flexibleTimeWindow":{"mode":"OFF"},"scheduleExpression":"rate(30 minutes)","scheduleExpressionTimezone":"Etc/UTC","state":"ENABLED","target":{"arn":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]},"roleArn":{"Fn::GetAtt":["SchedulerRoleForTarget8b3a82594BF5FC","Arn"]},"retryPolicy":{"maximumEventAgeInSeconds":86400,"maximumRetryAttempts":185},"ecsParameters":{"taskDefinitionArn":{"Ref":"Ec2TaskDefinitionB25030BE"},"capacityProviderStrategy":[{"capacityProvider":{"Ref":"EC2CapacityProvider5A2E35CD"},"weight":1,"base":1}],"tags":[{"key":"integ-test-tag-key","value":"integ-test-tag-value"}],"propagateTags":"TASK_DEFINITION"}}}}}}},"SchedulerRoleForTarget-8b3a82":{"id":"SchedulerRoleForTarget-8b3a82","path":"aws-cdk-ecs-run-task-ec2-schedule/SchedulerRoleForTarget-8b3a82","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportSchedulerRoleForTarget-8b3a82":{"id":"ImportSchedulerRoleForTarget-8b3a82","path":"aws-cdk-ecs-run-task-ec2-schedule/SchedulerRoleForTarget-8b3a82/ImportSchedulerRoleForTarget-8b3a82","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/SchedulerRoleForTarget-8b3a82/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","Condition":{"StringEquals":{"aws:SourceAccount":{"Ref":"AWS::AccountId"},"aws:SourceArn":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":scheduler:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":schedule-group/default"]]}}},"Effect":"Allow","Principal":{"Service":"scheduler.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-ecs-run-task-ec2-schedule/SchedulerRoleForTarget-8b3a82/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-ecs-run-task-ec2-schedule/SchedulerRoleForTarget-8b3a82/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":"iam:PassRole","Condition":{"StringLike":{"iam:PassedToService":"ecs-tasks.amazonaws.com"}},"Effect":"Allow","Resource":{"Fn::GetAtt":["Ec2TaskDefinitionTaskRole0B78BC85","Arn"]}},{"Action":"ecs:RunTask","Effect":"Allow","Resource":{"Ref":"Ec2TaskDefinitionB25030BE"}},{"Action":"ecs:TagResource","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":task/",{"Ref":"Ec2ClusterEE43E89D"},"/*"]]}}],"Version":"2012-10-17"},"policyName":"SchedulerRoleForTarget8b3a82DefaultPolicyB532E009","roles":[{"Ref":"SchedulerRoleForTarget8b3a82594BF5FC"}]}}}}}}},"Exports":{"id":"Exports","path":"aws-cdk-ecs-run-task-ec2-schedule/Exports","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Output{\"Fn::GetAtt\":[\"Ec2ClusterEE43E89D\",\"Arn\"]}":{"id":"Output{\"Fn::GetAtt\":[\"Ec2ClusterEE43E89D\",\"Arn\"]}","path":"aws-cdk-ecs-run-task-ec2-schedule/Exports/Output{\"Fn::GetAtt\":[\"Ec2ClusterEE43E89D\",\"Arn\"]}","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-cdk-ecs-run-task-ec2-schedule/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-cdk-ecs-run-task-ec2-schedule/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"integ-ecs-run-task-ec2":{"id":"integ-ecs-run-task-ec2","path":"integ-ecs-run-task-ec2","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"integ-ecs-run-task-ec2/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"integ-ecs-run-task-ec2/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684":{"id":"AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"},"children":{"SdkProvider":{"id":"SdkProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/SdkProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}},"Default":{"id":"Default","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/Default","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"Default":{"id":"Default","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/Default/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"WaitFor":{"id":"WaitFor","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"},"children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/IsCompleteProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"TimeoutProvider":{"id":"TimeoutProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/TimeoutProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Role":{"id":"Role","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Resource":{"id":"Resource","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/WaitFor/Resource","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"AssertionResults":{"id":"AssertionResults","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSlistTasks829f05f2fdc5ab21cff97554e2848684/AssertionResults","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}}}},"SingletonFunction1488541a7b23466481b69b4408076b81":{"id":"SingletonFunction1488541a7b23466481b69b4408076b81","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Staging":{"id":"Staging","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"SingletonFunction76b3e830a873425f8453eddd85c86925":{"id":"SingletonFunction76b3e830a873425f8453eddd85c86925","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Staging":{"id":"Staging","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction76b3e830a873425f8453eddd85c86925/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a":{"id":"SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Staging":{"id":"Staging","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/SingletonFunction5c1898e096fb4e3e95d5f6c67f3ce41a/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"AwsApiCallECSstopTask057e432cca615475289dd5332b83dc97":{"id":"AwsApiCallECSstopTask057e432cca615475289dd5332b83dc97","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSstopTask057e432cca615475289dd5332b83dc97","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"},"children":{"SdkProvider":{"id":"SdkProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSstopTask057e432cca615475289dd5332b83dc97/SdkProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSstopTask057e432cca615475289dd5332b83dc97/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}},"Default":{"id":"Default","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSstopTask057e432cca615475289dd5332b83dc97/Default","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSstopTask057e432cca615475289dd5332b83dc97/Default/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38":{"id":"AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AwsApiCall","version":"0.0.0"},"children":{"SdkProvider":{"id":"SdkProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/SdkProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/SdkProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}},"Default":{"id":"Default","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/Default","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*","*","*"]},"children":{"Default":{"id":"Default","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/Default/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"WaitFor":{"id":"WaitFor","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.WaiterStateMachine","version":"0.0.0"},"children":{"IsCompleteProvider":{"id":"IsCompleteProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/IsCompleteProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/IsCompleteProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/IsCompleteProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"TimeoutProvider":{"id":"TimeoutProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/TimeoutProvider","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.AssertionsProvider","version":"0.0.0"},"children":{"AssertionsProvider":{"id":"AssertionsProvider","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/TimeoutProvider/AssertionsProvider","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"Invoke":{"id":"Invoke","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/TimeoutProvider/Invoke","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Role":{"id":"Role","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Resource":{"id":"Resource","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/WaitFor/Resource","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"AssertionResults":{"id":"AssertionResults","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/AwsApiCallECSdescribeTasks7680c893d5ffea114a8eaf370e6fbc38/AssertionResults","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"integ-ecs-run-task-ec2/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-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/SfnTasksEcsEc2RunTaskTestDefaultTestDeployAssert2569343D.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/SfnTasksEcsEc2RunTaskTestDefaultTestDeployAssert2569343D.assets.json
index 1e381354514cb..ad9e02fed5ed1 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/SfnTasksEcsEc2RunTaskTestDefaultTestDeployAssert2569343D.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/SfnTasksEcsEc2RunTaskTestDefaultTestDeployAssert2569343D.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "SfnTasksEcsEc2RunTaskTestDefaultTestDeployAssert2569343D Template",
"source": {
"path": "SfnTasksEcsEc2RunTaskTestDefaultTestDeployAssert2569343D.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/aws-sfn-tasks-ecs-run-task-ref-task-definition.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/aws-sfn-tasks-ecs-run-task-ref-task-definition.assets.json
index 103a366f44f35..fe337f671c653 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/aws-sfn-tasks-ecs-run-task-ref-task-definition.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/aws-sfn-tasks-ecs-run-task-ref-task-definition.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "a04c65eb154cc930d6f8ea8a3d18f4216f96457a1d86647792aa47f6e2cecbe7": {
+ "1ab3886bf3317ea8a7b23da1cb1105a6d117c687dbb7de3861da94df3fb02cb6": {
+ "displayName": "aws-sfn-tasks-ecs-run-task-ref-task-definition Template",
"source": {
"path": "aws-sfn-tasks-ecs-run-task-ref-task-definition.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-bce1b4f9": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "a04c65eb154cc930d6f8ea8a3d18f4216f96457a1d86647792aa47f6e2cecbe7.json",
+ "objectKey": "1ab3886bf3317ea8a7b23da1cb1105a6d117c687dbb7de3861da94df3fb02cb6.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
@@ -17,11 +18,12 @@
},
"dockerImages": {
"d87af9b5acc567118fa529d3d3b763098200a6446a5ca64aea987729efd52534": {
+ "displayName": "TaskDef/Container/AssetImage",
"source": {
"directory": "asset.d87af9b5acc567118fa529d3d3b763098200a6446a5ca64aea987729efd52534"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-dd0fae61": {
"repositoryName": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}",
"imageTag": "d87af9b5acc567118fa529d3d3b763098200a6446a5ca64aea987729efd52534",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-image-publishing-role-${AWS::AccountId}-${AWS::Region}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/aws-sfn-tasks-ecs-run-task-ref-task-definition.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/aws-sfn-tasks-ecs-run-task-ref-task-definition.template.json
index 7cce5cb92eb14..688cdf36ad658 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/aws-sfn-tasks-ecs-run-task-ref-task-definition.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/aws-sfn-tasks-ecs-run-task-ref-task-definition.template.json
@@ -755,7 +755,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/integ.json
index 783a7a0c2868c..5d4f957008ebf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"SfnTasksEcsEc2RunTaskTest/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "SfnTasksEcsEc2RunTaskTest/DefaultTest/DeployAssert",
"assertionStackName": "SfnTasksEcsEc2RunTaskTestDefaultTestDeployAssert2569343D"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/manifest.json
index 24ebfe4a2d126..55a7816d14364 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-sfn-tasks-ecs-run-task-ref-task-definition.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/a04c65eb154cc930d6f8ea8a3d18f4216f96457a1d86647792aa47f6e2cecbe7.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/1ab3886bf3317ea8a7b23da1cb1105a6d117c687dbb7de3861da94df3fb02cb6.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1254,51 +1254,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole0C4190B7C": [
- {
- "type": "aws:cdk:logicalId",
- "data": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole0C4190B7C",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole18817D25E": [
- {
- "type": "aws:cdk:logicalId",
- "data": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole18817D25E",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole274ABEFAA": [
- {
- "type": "aws:cdk:logicalId",
- "data": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole274ABEFAA",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole35049FE26": [
- {
- "type": "aws:cdk:logicalId",
- "data": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole35049FE26",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole46BD5E1C5": [
- {
- "type": "aws:cdk:logicalId",
- "data": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole46BD5E1C5",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-sfn-tasks-ecs-run-task-ref-task-definition"
@@ -1356,6 +1311,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/tree.json
index eac0495e7e3ab..7fa0e96c77dee 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task-ref-definition.js.snapshot/tree.json
@@ -1,2710 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-sfn-tasks-ecs-run-task-ref-task-definition": {
- "id": "aws-sfn-tasks-ecs-run-task-ref-task-definition",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition",
- "children": {
- "Ec2Cluster": {
- "id": "Ec2Cluster",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "Vpc": {
- "id": "Vpc",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/Resource",
- "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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1/Subnet",
- "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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPublicSubnet1RouteTableE30610F5"
- },
- "subnetId": {
- "Ref": "Ec2ClusterVpcPublicSubnet1SubnetD46FD92B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "Ec2ClusterVpcIGW605638EB"
- },
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPublicSubnet1RouteTableE30610F5"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "Ec2ClusterVpcPublicSubnet1EIPD4B5D142",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "Ec2ClusterVpcPublicSubnet1SubnetD46FD92B"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2/Subnet",
- "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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPublicSubnet2RouteTable44A09188"
- },
- "subnetId": {
- "Ref": "Ec2ClusterVpcPublicSubnet2Subnet207D9E5E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "Ec2ClusterVpcIGW605638EB"
- },
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPublicSubnet2RouteTable44A09188"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "Ec2ClusterVpcPublicSubnet2EIP921925E6",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "Ec2ClusterVpcPublicSubnet2Subnet207D9E5E"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet1/Subnet",
- "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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPrivateSubnet1RouteTable50D391D1"
- },
- "subnetId": {
- "Ref": "Ec2ClusterVpcPrivateSubnet1Subnet0AE9B91E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "Ec2ClusterVpcPublicSubnet1NATGateway79A8A839"
- },
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPrivateSubnet1RouteTable50D391D1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet2/Subnet",
- "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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPrivateSubnet2RouteTable22B9DAE6"
- },
- "subnetId": {
- "Ref": "Ec2ClusterVpcPrivateSubnet2Subnet16B68C19"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "Ec2ClusterVpcPublicSubnet2NATGateway302F96C0"
- },
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPrivateSubnet2RouteTable22B9DAE6"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "Ec2ClusterVpcIGW605638EB"
- },
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*"
- }
- ]
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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": [
- "Ec2ClusterEE43E89D",
- "Arn"
- ]
- }
- },
- {
- "Action": [
- "ecs:Poll",
- "ecs:StartTelemetrySession"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "Ec2ClusterEE43E89D",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecr:GetAuthorizationToken",
- "ecs:DiscoverPollEndpoint",
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "Ec2ClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy6D2DC2FD",
- "roles": [
- {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupInstanceRole73D80898"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupInstanceRole73D80898"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupInstanceProfileDB232471",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "t2.micro",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupInstanceSecurityGroup149B0A9E",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "#!/bin/bash\necho ECS_CLUSTER=",
- {
- "Ref": "Ec2ClusterEE43E89D"
- },
- " >> /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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLaunchTemplate346F58BE"
- },
- "version": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupLaunchTemplate346F58BE",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "1",
- "minSize": "1",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "Ec2ClusterVpcPublicSubnet1SubnetD46FD92B"
- },
- {
- "Ref": "Ec2ClusterVpcPublicSubnet2Subnet207D9E5E"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "Ec2ClusterDefaultAutoScalingGroupASGC5A6D4C0"
- }
- ]
- ]
- }
- },
- {
- "Action": [
- "ecs:DescribeContainerInstances",
- "ecs:DescribeTasks",
- "ecs:ListTasks",
- "ecs:UpdateContainerInstancesState"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "Ec2ClusterEE43E89D",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecs:ListContainerInstances",
- "ecs:SubmitContainerStateChange",
- "ecs:SubmitTaskStateChange"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "Ec2ClusterEE43E89D",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicy638C9E33",
- "roles": [
- {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole23116FA3"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": "Ec2ClusterEE43E89D"
- }
- }
- },
- "handler": "index.lambda_handler",
- "role": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole23116FA3",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awssfntasksecsruntaskreftaskdefinitionEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic31C4EDE4": {
- "id": "AllowInvoke:awssfntasksecsruntaskreftaskdefinitionEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic31C4EDE4",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awssfntasksecsruntaskreftaskdefinitionEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic31C4EDE4",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionE0DEFB31",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionE0DEFB31",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicyE499974B",
- "roles": [
- {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole71045ED7"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupASGC5A6D4C0"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole71045ED7",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "machineImage": "*",
- "updateType": "Replace",
- "instanceType": "*",
- "vpcSubnets": {
- "subnetType": "Public"
- }
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*",
- "vpcSubnets": {
- "subnetType": "Public"
- }
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-sfn-tasks-ecs-run-task-ref-task-definition/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-sfn-tasks-ecs-run-task-ref-task-definition/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-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": {
- "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:d87af9b5acc567118fa529d3d3b763098200a6446a5ca64aea987729efd52534"
- },
- "memory": 256,
- "name": "Container"
- }
- ],
- "executionRoleArn": {
- "Fn::GetAtt": [
- "TaskDefExecutionRoleB4775C97",
- "Arn"
- ]
- },
- "family": "awssfntasksecsruntaskreftaskdefinitionTaskDefAAB386BE",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "Container": {
- "id": "Container",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/Container",
- "children": {
- "AssetImage": {
- "id": "AssetImage",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/Container/AssetImage",
- "children": {
- "Staging": {
- "id": "Staging",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/Container/AssetImage/Staging",
- "constructInfo": {
- "fqn": "aws-cdk-lib.AssetStaging",
- "version": "0.0.0"
- }
- },
- "Repository": {
- "id": "Repository",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/Container/AssetImage/Repository",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase",
- "version": "0.0.0",
- "metadata": []
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "ecr:BatchCheckLayerAvailability",
- "ecr:BatchGetImage",
- "ecr:GetDownloadUrlForLayer"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecr:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":repository/",
- {
- "Fn::Sub": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"
- }
- ]
- ]
- }
- },
- {
- "Action": "ecr:GetAuthorizationToken",
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "TaskDefExecutionRoleDefaultPolicy0DBB737A",
- "roles": [
- {
- "Ref": "TaskDefExecutionRoleB4775C97"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- },
- "roleName": "*"
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*",
- "*"
- ]
- }
- },
- "Start": {
- "id": "Start",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Start",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_stepfunctions.Pass",
- "version": "0.0.0"
- }
- },
- "Run": {
- "id": "Run",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/Run",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_stepfunctions_tasks.EcsRunTask",
- "version": "0.0.0"
- }
- },
- "StateMachine": {
- "id": "StateMachine",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/StateMachine",
- "children": {
- "Role": {
- "id": "Role",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/StateMachine/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/StateMachine/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/StateMachine/Role/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Role",
- "aws:cdk:cloudformation:props": {
- "assumeRolePolicyDocument": {
- "Statement": [
- {
- "Action": "sts:AssumeRole",
- "Effect": "Allow",
- "Principal": {
- "Service": "states.amazonaws.com"
- }
- }
- ],
- "Version": "2012-10-17"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/StateMachine/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/StateMachine/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "ecs:RunTask",
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Fn::Select": [
- 1,
- {
- "Fn::Split": [
- ":",
- {
- "Ref": "TaskDef54694570"
- }
- ]
- }
- ]
- },
- ":",
- {
- "Fn::Select": [
- 2,
- {
- "Fn::Split": [
- ":",
- {
- "Ref": "TaskDef54694570"
- }
- ]
- }
- ]
- },
- ":",
- {
- "Fn::Select": [
- 3,
- {
- "Fn::Split": [
- ":",
- {
- "Ref": "TaskDef54694570"
- }
- ]
- }
- ]
- },
- ":",
- {
- "Fn::Select": [
- 4,
- {
- "Fn::Split": [
- ":",
- {
- "Ref": "TaskDef54694570"
- }
- ]
- }
- ]
- },
- ":",
- {
- "Fn::Select": [
- 0,
- {
- "Fn::Split": [
- "/",
- {
- "Fn::Select": [
- 5,
- {
- "Fn::Split": [
- ":",
- {
- "Ref": "TaskDef54694570"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- },
- "/",
- {
- "Fn::Select": [
- 1,
- {
- "Fn::Split": [
- "/",
- {
- "Fn::Select": [
- 5,
- {
- "Fn::Split": [
- ":",
- {
- "Ref": "TaskDef54694570"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- },
- ":*"
- ]
- ]
- }
- },
- {
- "Action": [
- "ecs:DescribeTasks",
- "ecs:StopTask"
- ],
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": "iam:PassRole",
- "Effect": "Allow",
- "Resource": [
- {
- "Fn::GetAtt": [
- "TaskDefExecutionRoleB4775C97",
- "Arn"
- ]
- },
- {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- ]
- },
- {
- "Action": [
- "events:DescribeRule",
- "events:PutRule",
- "events:PutTargets"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":events:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":rule/StepFunctionsGetEventsForECSTaskRule"
- ]
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "StateMachineRoleDefaultPolicyDF1E6607",
- "roles": [
- {
- "Ref": "StateMachineRoleB840431D"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/StateMachine/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::StepFunctions::StateMachine",
- "aws:cdk:cloudformation:props": {
- "definitionString": {
- "Fn::Join": [
- "",
- [
- "{\"StartAt\":\"Start\",\"States\":{\"Start\":{\"Type\":\"Pass\",\"Result\":{\"SomeKey\":\"SomeValue\"},\"Next\":\"Run\"},\"Run\":{\"End\":true,\"Type\":\"Task\",\"Resource\":\"arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":states:::ecs:runTask.sync\",\"Parameters\":{\"Cluster\":\"",
- {
- "Fn::GetAtt": [
- "Ec2ClusterEE43E89D",
- "Arn"
- ]
- },
- "\",\"TaskDefinition\":\"awssfntasksecsruntaskreftaskdefinitionTaskDefAAB386BE\",\"Overrides\":{\"ContainerOverrides\":[{\"Name\":\"Container\"}]},\"LaunchType\":\"EC2\"}}}}"
- ]
- ]
- },
- "roleArn": {
- "Fn::GetAtt": [
- "StateMachineRoleB840431D",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_stepfunctions.CfnStateMachine",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_stepfunctions.StateMachine",
- "version": "0.0.0",
- "metadata": [
- {
- "definition": {
- "id": "*",
- "startState": "*",
- "endStates": "*"
- }
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-sfn-tasks-ecs-run-task-ref-task-definition/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "SfnTasksEcsEc2RunTaskTest": {
- "id": "SfnTasksEcsEc2RunTaskTest",
- "path": "SfnTasksEcsEc2RunTaskTest",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "SfnTasksEcsEc2RunTaskTest/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "SfnTasksEcsEc2RunTaskTest/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "SfnTasksEcsEc2RunTaskTest/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "SfnTasksEcsEc2RunTaskTest/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "SfnTasksEcsEc2RunTaskTest/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-sfn-tasks-ecs-run-task-ref-task-definition":{"id":"aws-sfn-tasks-ecs-run-task-ref-task-definition","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Ec2Cluster":{"id":"Ec2Cluster","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":["*",{"addCapacity":["*",{"instanceType":"*","vpcSubnets":{"subnetType":"Public"}}]},{"addAutoScalingGroup":["*",{"machineImageType":0}]}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":{}}},"Vpc":{"id":"Vpc","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"Acl":{"id":"Acl","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":"Ec2ClusterVpcPublicSubnet1RouteTableE30610F5"},"subnetId":{"Ref":"Ec2ClusterVpcPublicSubnet1SubnetD46FD92B"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":"Ec2ClusterVpcIGW605638EB"},"routeTableId":{"Ref":"Ec2ClusterVpcPublicSubnet1RouteTableE30610F5"}}}},"EIP":{"id":"EIP","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":["Ec2ClusterVpcPublicSubnet1EIPD4B5D142","AllocationId"]},"subnetId":{"Ref":"Ec2ClusterVpcPublicSubnet1SubnetD46FD92B"},"tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"Acl":{"id":"Acl","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":"Ec2ClusterVpcPublicSubnet2RouteTable44A09188"},"subnetId":{"Ref":"Ec2ClusterVpcPublicSubnet2Subnet207D9E5E"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":"Ec2ClusterVpcIGW605638EB"},"routeTableId":{"Ref":"Ec2ClusterVpcPublicSubnet2RouteTable44A09188"}}}},"EIP":{"id":"EIP","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":["Ec2ClusterVpcPublicSubnet2EIP921925E6","AllocationId"]},"subnetId":{"Ref":"Ec2ClusterVpcPublicSubnet2Subnet207D9E5E"},"tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"Acl":{"id":"Acl","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":"Ec2ClusterVpcPrivateSubnet1RouteTable50D391D1"},"subnetId":{"Ref":"Ec2ClusterVpcPrivateSubnet1Subnet0AE9B91E"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":"Ec2ClusterVpcPublicSubnet1NATGateway79A8A839"},"routeTableId":{"Ref":"Ec2ClusterVpcPrivateSubnet1RouteTable50D391D1"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"Acl":{"id":"Acl","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":"Ec2ClusterVpcPrivateSubnet2RouteTable22B9DAE6"},"subnetId":{"Ref":"Ec2ClusterVpcPrivateSubnet2Subnet16B68C19"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":"Ec2ClusterVpcPublicSubnet2NATGateway302F96C0"},"routeTableId":{"Ref":"Ec2ClusterVpcPrivateSubnet2RouteTable22B9DAE6"}}}}}},"IGW":{"id":"IGW","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":"Ec2ClusterVpcIGW605638EB"},"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}}}},"DefaultAutoScalingGroup":{"id":"DefaultAutoScalingGroup","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","instanceType":"*","vpcSubnets":{"subnetType":"Public"}},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":["Ec2ClusterEE43E89D","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"Ec2ClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy6D2DC2FD","roles":[{"Ref":"Ec2ClusterDefaultAutoScalingGroupInstanceRole73D80898"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":"Ec2ClusterDefaultAutoScalingGroupInstanceRole73D80898"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":["Ec2ClusterDefaultAutoScalingGroupInstanceProfileDB232471","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["Ec2ClusterDefaultAutoScalingGroupInstanceSecurityGroup149B0A9E","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"Ec2ClusterEE43E89D"}," >> /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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":"Ec2ClusterDefaultAutoScalingGroupLaunchTemplate346F58BE"},"version":{"Fn::GetAtt":["Ec2ClusterDefaultAutoScalingGroupLaunchTemplate346F58BE","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"Ec2ClusterVpcPublicSubnet1SubnetD46FD92B"},{"Ref":"Ec2ClusterVpcPublicSubnet2Subnet207D9E5E"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":"Ec2ClusterDefaultAutoScalingGroupASGC5A6D4C0"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]}}],"Version":"2012-10-17"},"policyName":"Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicy638C9E33","roles":[{"Ref":"Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole23116FA3"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":"Ec2ClusterEE43E89D"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole23116FA3","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awssfntasksecsruntaskreftaskdefinitionEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic31C4EDE4":{"id":"AllowInvoke:awssfntasksecsruntaskreftaskdefinitionEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic31C4EDE4","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awssfntasksecsruntaskreftaskdefinitionEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic31C4EDE4","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":["Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionE0DEFB31","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"}}}},"Topic":{"id":"Topic","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":["Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionE0DEFB31","Arn"]},"protocol":"lambda","topicArn":{"Ref":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"}}],"Version":"2012-10-17"},"policyName":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicyE499974B","roles":[{"Ref":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole71045ED7"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Ec2Cluster/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":"Ec2ClusterDefaultAutoScalingGroupASGC5A6D4C0"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"},"roleArn":{"Fn::GetAtt":["Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole71045ED7","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-sfn-tasks-ecs-run-task-ref-task-definition/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-sfn-tasks-ecs-run-task-ref-task-definition/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-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/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-sfn-tasks-ecs-run-task-ref-task-definition/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":{"Fn::Sub":"${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:d87af9b5acc567118fa529d3d3b763098200a6446a5ca64aea987729efd52534"},"memory":256,"name":"Container"}],"executionRoleArn":{"Fn::GetAtt":["TaskDefExecutionRoleB4775C97","Arn"]},"family":"awssfntasksecsruntaskreftaskdefinitionTaskDefAAB386BE","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"Container":{"id":"Container","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/Container","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"AssetImage":{"id":"AssetImage","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/Container/AssetImage","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr_assets.DockerImageAsset","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/Container/AssetImage/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Repository":{"id":"Repository","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/Container/AssetImage/Repository","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr.RepositoryBase","version":"0.0.0","metadata":[]}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/ExecutionRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/TaskDef/ExecutionRole/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":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Fn::Sub":"cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"}]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"TaskDefExecutionRoleDefaultPolicy0DBB737A","roles":[{"Ref":"TaskDefExecutionRoleB4775C97"}]}}}}}}}}},"Start":{"id":"Start","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Start","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.Pass","version":"0.0.0"}},"Run":{"id":"Run","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/Run","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions_tasks.EcsRunTask","version":"0.0.0"}},"StateMachine":{"id":"StateMachine","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/StateMachine","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.StateMachine","version":"0.0.0","metadata":[{"definition":{"id":"*","startState":"*","endStates":"*"}},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"Role":{"id":"Role","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/StateMachine/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportRole":{"id":"ImportRole","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/StateMachine/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/StateMachine/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":"states.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/StateMachine/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/StateMachine/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":"ecs:RunTask","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Fn::Select":[1,{"Fn::Split":[":",{"Ref":"TaskDef54694570"}]}]},":",{"Fn::Select":[2,{"Fn::Split":[":",{"Ref":"TaskDef54694570"}]}]},":",{"Fn::Select":[3,{"Fn::Split":[":",{"Ref":"TaskDef54694570"}]}]},":",{"Fn::Select":[4,{"Fn::Split":[":",{"Ref":"TaskDef54694570"}]}]},":",{"Fn::Select":[0,{"Fn::Split":["/",{"Fn::Select":[5,{"Fn::Split":[":",{"Ref":"TaskDef54694570"}]}]}]}]},"/",{"Fn::Select":[1,{"Fn::Split":["/",{"Fn::Select":[5,{"Fn::Split":[":",{"Ref":"TaskDef54694570"}]}]}]}]},":*"]]}},{"Action":["ecs:DescribeTasks","ecs:StopTask"],"Effect":"Allow","Resource":"*"},{"Action":"iam:PassRole","Effect":"Allow","Resource":[{"Fn::GetAtt":["TaskDefExecutionRoleB4775C97","Arn"]},{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}]},{"Action":["events:DescribeRule","events:PutRule","events:PutTargets"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":events:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":rule/StepFunctionsGetEventsForECSTaskRule"]]}}],"Version":"2012-10-17"},"policyName":"StateMachineRoleDefaultPolicyDF1E6607","roles":[{"Ref":"StateMachineRoleB840431D"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/StateMachine/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.CfnStateMachine","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::StepFunctions::StateMachine","aws:cdk:cloudformation:props":{"definitionString":{"Fn::Join":["",["{\"StartAt\":\"Start\",\"States\":{\"Start\":{\"Type\":\"Pass\",\"Result\":{\"SomeKey\":\"SomeValue\"},\"Next\":\"Run\"},\"Run\":{\"End\":true,\"Type\":\"Task\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::ecs:runTask.sync\",\"Parameters\":{\"Cluster\":\"",{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]},"\",\"TaskDefinition\":\"awssfntasksecsruntaskreftaskdefinitionTaskDefAAB386BE\",\"Overrides\":{\"ContainerOverrides\":[{\"Name\":\"Container\"}]},\"LaunchType\":\"EC2\"}}}}"]]},"roleArn":{"Fn::GetAtt":["StateMachineRoleB840431D","Arn"]}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-sfn-tasks-ecs-run-task-ref-task-definition/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"SfnTasksEcsEc2RunTaskTest":{"id":"SfnTasksEcsEc2RunTaskTest","path":"SfnTasksEcsEc2RunTaskTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"SfnTasksEcsEc2RunTaskTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"SfnTasksEcsEc2RunTaskTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"SfnTasksEcsEc2RunTaskTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"SfnTasksEcsEc2RunTaskTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"SfnTasksEcsEc2RunTaskTest/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-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/SfnTasksEcsEc2RunTaskTestDefaultTestDeployAssert2569343D.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/SfnTasksEcsEc2RunTaskTestDefaultTestDeployAssert2569343D.assets.json
index 1e381354514cb..ad9e02fed5ed1 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/SfnTasksEcsEc2RunTaskTestDefaultTestDeployAssert2569343D.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/SfnTasksEcsEc2RunTaskTestDefaultTestDeployAssert2569343D.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "SfnTasksEcsEc2RunTaskTestDefaultTestDeployAssert2569343D Template",
"source": {
"path": "SfnTasksEcsEc2RunTaskTestDefaultTestDeployAssert2569343D.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/aws-sfn-tasks-ecs-run-task.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/aws-sfn-tasks-ecs-run-task.assets.json
index ed5c2328b7da0..f330778a552b0 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/aws-sfn-tasks-ecs-run-task.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/aws-sfn-tasks-ecs-run-task.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "034d7f988da203540ca02686cfe2cc037bc70239c1f4d051a369c99f8fa0fac1": {
+ "c8561ad2ac11f39d2b53b5bc12dc1047219b85ba7422aa39f6c9aa91c416c68a": {
+ "displayName": "aws-sfn-tasks-ecs-run-task Template",
"source": {
"path": "aws-sfn-tasks-ecs-run-task.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-9553c5be": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "034d7f988da203540ca02686cfe2cc037bc70239c1f4d051a369c99f8fa0fac1.json",
+ "objectKey": "c8561ad2ac11f39d2b53b5bc12dc1047219b85ba7422aa39f6c9aa91c416c68a.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
@@ -17,11 +18,12 @@
},
"dockerImages": {
"d87af9b5acc567118fa529d3d3b763098200a6446a5ca64aea987729efd52534": {
+ "displayName": "TaskDef/Container/AssetImage",
"source": {
"directory": "asset.d87af9b5acc567118fa529d3d3b763098200a6446a5ca64aea987729efd52534"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-dd0fae61": {
"repositoryName": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}",
"imageTag": "d87af9b5acc567118fa529d3d3b763098200a6446a5ca64aea987729efd52534",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-image-publishing-role-${AWS::AccountId}-${AWS::Region}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/aws-sfn-tasks-ecs-run-task.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/aws-sfn-tasks-ecs-run-task.template.json
index f696732ceecda..de1d0df6f865c 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/aws-sfn-tasks-ecs-run-task.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/aws-sfn-tasks-ecs-run-task.template.json
@@ -755,7 +755,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/integ.json
index 0f1da5f5f922f..597a813e71d84 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"SfnTasksEcsEc2RunTaskTest/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "SfnTasksEcsEc2RunTaskTest/DefaultTest/DeployAssert",
"assertionStackName": "SfnTasksEcsEc2RunTaskTestDefaultTestDeployAssert2569343D"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/manifest.json
index 39a26263715bc..d6e6c19278602 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-sfn-tasks-ecs-run-task.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/034d7f988da203540ca02686cfe2cc037bc70239c1f4d051a369c99f8fa0fac1.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/c8561ad2ac11f39d2b53b5bc12dc1047219b85ba7422aa39f6c9aa91c416c68a.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1294,51 +1294,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole0C4190B7C": [
- {
- "type": "aws:cdk:logicalId",
- "data": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole0C4190B7C",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole18817D25E": [
- {
- "type": "aws:cdk:logicalId",
- "data": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole18817D25E",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole274ABEFAA": [
- {
- "type": "aws:cdk:logicalId",
- "data": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole274ABEFAA",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole35049FE26": [
- {
- "type": "aws:cdk:logicalId",
- "data": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole35049FE26",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole46BD5E1C5": [
- {
- "type": "aws:cdk:logicalId",
- "data": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole46BD5E1C5",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-sfn-tasks-ecs-run-task"
@@ -1396,6 +1351,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/tree.json
index aae2c37371a5d..0a7caf124f4d3 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-run-task.js.snapshot/tree.json
@@ -1,2781 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-sfn-tasks-ecs-run-task": {
- "id": "aws-sfn-tasks-ecs-run-task",
- "path": "aws-sfn-tasks-ecs-run-task",
- "children": {
- "Ec2Cluster": {
- "id": "Ec2Cluster",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "Vpc": {
- "id": "Vpc",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/Resource",
- "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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1/Subnet",
- "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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPublicSubnet1RouteTableE30610F5"
- },
- "subnetId": {
- "Ref": "Ec2ClusterVpcPublicSubnet1SubnetD46FD92B"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "Ec2ClusterVpcIGW605638EB"
- },
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPublicSubnet1RouteTableE30610F5"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "Ec2ClusterVpcPublicSubnet1EIPD4B5D142",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "Ec2ClusterVpcPublicSubnet1SubnetD46FD92B"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2/Subnet",
- "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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPublicSubnet2RouteTable44A09188"
- },
- "subnetId": {
- "Ref": "Ec2ClusterVpcPublicSubnet2Subnet207D9E5E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "Ec2ClusterVpcIGW605638EB"
- },
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPublicSubnet2RouteTable44A09188"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "Ec2ClusterVpcPublicSubnet2EIP921925E6",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "Ec2ClusterVpcPublicSubnet2Subnet207D9E5E"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet1/Subnet",
- "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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPrivateSubnet1RouteTable50D391D1"
- },
- "subnetId": {
- "Ref": "Ec2ClusterVpcPrivateSubnet1Subnet0AE9B91E"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "Ec2ClusterVpcPublicSubnet1NATGateway79A8A839"
- },
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPrivateSubnet1RouteTable50D391D1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet2/Subnet",
- "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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPrivateSubnet2RouteTable22B9DAE6"
- },
- "subnetId": {
- "Ref": "Ec2ClusterVpcPrivateSubnet2Subnet16B68C19"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "Ec2ClusterVpcPublicSubnet2NATGateway302F96C0"
- },
- "routeTableId": {
- "Ref": "Ec2ClusterVpcPrivateSubnet2RouteTable22B9DAE6"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "Ec2ClusterVpcIGW605638EB"
- },
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*"
- }
- ]
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "Ec2ClusterVpc568127F1"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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": [
- "Ec2ClusterEE43E89D",
- "Arn"
- ]
- }
- },
- {
- "Action": [
- "ecs:Poll",
- "ecs:StartTelemetrySession"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "Ec2ClusterEE43E89D",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecr:GetAuthorizationToken",
- "ecs:DiscoverPollEndpoint",
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "Ec2ClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy6D2DC2FD",
- "roles": [
- {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupInstanceRole73D80898"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupInstanceRole73D80898"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupInstanceProfileDB232471",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "t2.micro",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupInstanceSecurityGroup149B0A9E",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "#!/bin/bash\necho ECS_CLUSTER=",
- {
- "Ref": "Ec2ClusterEE43E89D"
- },
- " >> /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-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLaunchTemplate346F58BE"
- },
- "version": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupLaunchTemplate346F58BE",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "1",
- "minSize": "1",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "Ec2ClusterVpcPublicSubnet1SubnetD46FD92B"
- },
- {
- "Ref": "Ec2ClusterVpcPublicSubnet2Subnet207D9E5E"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "Ec2ClusterDefaultAutoScalingGroupASGC5A6D4C0"
- }
- ]
- ]
- }
- },
- {
- "Action": [
- "ecs:DescribeContainerInstances",
- "ecs:DescribeTasks",
- "ecs:ListTasks",
- "ecs:UpdateContainerInstancesState"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "Ec2ClusterEE43E89D",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecs:ListContainerInstances",
- "ecs:SubmitContainerStateChange",
- "ecs:SubmitTaskStateChange"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "Ec2ClusterEE43E89D",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicy638C9E33",
- "roles": [
- {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole23116FA3"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": "Ec2ClusterEE43E89D"
- }
- }
- },
- "handler": "index.lambda_handler",
- "role": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole23116FA3",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awssfntasksecsruntaskEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7B5DFDE": {
- "id": "AllowInvoke:awssfntasksecsruntaskEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7B5DFDE",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awssfntasksecsruntaskEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7B5DFDE",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionE0DEFB31",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionE0DEFB31",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicyE499974B",
- "roles": [
- {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole71045ED7"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupASGC5A6D4C0"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole71045ED7",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "machineImage": "*",
- "updateType": "Replace",
- "instanceType": "*",
- "vpcSubnets": {
- "subnetType": "Public"
- }
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*",
- "vpcSubnets": {
- "subnetType": "Public"
- }
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-sfn-tasks-ecs-run-task/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-sfn-tasks-ecs-run-task/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-sfn-tasks-ecs-run-task/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-sfn-tasks-ecs-run-task/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-sfn-tasks-ecs-run-task/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": {
- "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:d87af9b5acc567118fa529d3d3b763098200a6446a5ca64aea987729efd52534"
- },
- "memory": 256,
- "name": "Container",
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": {
- "Ref": "TaskDefContainerLogGroupB60E6F44"
- },
- "awslogs-stream-prefix": "EventDemo",
- "awslogs-region": {
- "Ref": "AWS::Region"
- }
- }
- }
- }
- ],
- "executionRoleArn": {
- "Fn::GetAtt": [
- "TaskDefExecutionRoleB4775C97",
- "Arn"
- ]
- },
- "family": "awssfntasksecsruntaskTaskDef75140181",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "Container": {
- "id": "Container",
- "path": "aws-sfn-tasks-ecs-run-task/TaskDef/Container",
- "children": {
- "AssetImage": {
- "id": "AssetImage",
- "path": "aws-sfn-tasks-ecs-run-task/TaskDef/Container/AssetImage",
- "children": {
- "Staging": {
- "id": "Staging",
- "path": "aws-sfn-tasks-ecs-run-task/TaskDef/Container/AssetImage/Staging",
- "constructInfo": {
- "fqn": "aws-cdk-lib.AssetStaging",
- "version": "0.0.0"
- }
- },
- "Repository": {
- "id": "Repository",
- "path": "aws-sfn-tasks-ecs-run-task/TaskDef/Container/AssetImage/Repository",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase",
- "version": "0.0.0",
- "metadata": []
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset",
- "version": "0.0.0"
- }
- },
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-sfn-tasks-ecs-run-task/TaskDef/Container/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/TaskDef/Container/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "retention": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-sfn-tasks-ecs-run-task/TaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-sfn-tasks-ecs-run-task/TaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/TaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-sfn-tasks-ecs-run-task/TaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/TaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "ecr:BatchCheckLayerAvailability",
- "ecr:BatchGetImage",
- "ecr:GetDownloadUrlForLayer"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecr:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":repository/",
- {
- "Fn::Sub": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"
- }
- ]
- ]
- }
- },
- {
- "Action": "ecr:GetAuthorizationToken",
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "TaskDefContainerLogGroupB60E6F44",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "TaskDefExecutionRoleDefaultPolicy0DBB737A",
- "roles": [
- {
- "Ref": "TaskDefExecutionRoleB4775C97"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- },
- "roleName": "*"
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*",
- "*",
- "*"
- ]
- }
- },
- "Start": {
- "id": "Start",
- "path": "aws-sfn-tasks-ecs-run-task/Start",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_stepfunctions.Pass",
- "version": "0.0.0"
- }
- },
- "Run": {
- "id": "Run",
- "path": "aws-sfn-tasks-ecs-run-task/Run",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_stepfunctions_tasks.EcsRunTask",
- "version": "0.0.0"
- }
- },
- "StateMachine": {
- "id": "StateMachine",
- "path": "aws-sfn-tasks-ecs-run-task/StateMachine",
- "children": {
- "Role": {
- "id": "Role",
- "path": "aws-sfn-tasks-ecs-run-task/StateMachine/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-sfn-tasks-ecs-run-task/StateMachine/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/StateMachine/Role/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Role",
- "aws:cdk:cloudformation:props": {
- "assumeRolePolicyDocument": {
- "Statement": [
- {
- "Action": "sts:AssumeRole",
- "Effect": "Allow",
- "Principal": {
- "Service": "states.amazonaws.com"
- }
- }
- ],
- "Version": "2012-10-17"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-sfn-tasks-ecs-run-task/StateMachine/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/StateMachine/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "ecs:RunTask",
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Fn::Select": [
- 1,
- {
- "Fn::Split": [
- ":",
- {
- "Ref": "TaskDef54694570"
- }
- ]
- }
- ]
- },
- ":",
- {
- "Fn::Select": [
- 2,
- {
- "Fn::Split": [
- ":",
- {
- "Ref": "TaskDef54694570"
- }
- ]
- }
- ]
- },
- ":",
- {
- "Fn::Select": [
- 3,
- {
- "Fn::Split": [
- ":",
- {
- "Ref": "TaskDef54694570"
- }
- ]
- }
- ]
- },
- ":",
- {
- "Fn::Select": [
- 4,
- {
- "Fn::Split": [
- ":",
- {
- "Ref": "TaskDef54694570"
- }
- ]
- }
- ]
- },
- ":",
- {
- "Fn::Select": [
- 0,
- {
- "Fn::Split": [
- "/",
- {
- "Fn::Select": [
- 5,
- {
- "Fn::Split": [
- ":",
- {
- "Ref": "TaskDef54694570"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- },
- "/",
- {
- "Fn::Select": [
- 1,
- {
- "Fn::Split": [
- "/",
- {
- "Fn::Select": [
- 5,
- {
- "Fn::Split": [
- ":",
- {
- "Ref": "TaskDef54694570"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- },
- ":*"
- ]
- ]
- }
- },
- {
- "Action": [
- "ecs:DescribeTasks",
- "ecs:StopTask"
- ],
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": "iam:PassRole",
- "Effect": "Allow",
- "Resource": [
- {
- "Fn::GetAtt": [
- "TaskDefExecutionRoleB4775C97",
- "Arn"
- ]
- },
- {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- ]
- },
- {
- "Action": [
- "events:DescribeRule",
- "events:PutRule",
- "events:PutTargets"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":events:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":rule/StepFunctionsGetEventsForECSTaskRule"
- ]
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "StateMachineRoleDefaultPolicyDF1E6607",
- "roles": [
- {
- "Ref": "StateMachineRoleB840431D"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-run-task/StateMachine/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::StepFunctions::StateMachine",
- "aws:cdk:cloudformation:props": {
- "definitionString": {
- "Fn::Join": [
- "",
- [
- "{\"StartAt\":\"Start\",\"States\":{\"Start\":{\"Type\":\"Pass\",\"Result\":{\"SomeKey\":\"SomeValue\"},\"Next\":\"Run\"},\"Run\":{\"End\":true,\"Type\":\"Task\",\"Resource\":\"arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":states:::ecs:runTask.sync\",\"Parameters\":{\"Cluster\":\"",
- {
- "Fn::GetAtt": [
- "Ec2ClusterEE43E89D",
- "Arn"
- ]
- },
- "\",\"TaskDefinition\":\"awssfntasksecsruntaskTaskDef75140181\",\"Overrides\":{\"ContainerOverrides\":[{\"Name\":\"Container\",\"Environment\":[{\"Name\":\"SOME_KEY\",\"Value.$\":\"$.SomeKey\"}]}]},\"LaunchType\":\"EC2\",\"EnableExecuteCommand\":true}}}}"
- ]
- ]
- },
- "roleArn": {
- "Fn::GetAtt": [
- "StateMachineRoleB840431D",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_stepfunctions.CfnStateMachine",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_stepfunctions.StateMachine",
- "version": "0.0.0",
- "metadata": [
- {
- "definition": {
- "id": "*",
- "startState": "*",
- "endStates": "*"
- }
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- },
- "stateMachineArn": {
- "id": "stateMachineArn",
- "path": "aws-sfn-tasks-ecs-run-task/stateMachineArn",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnOutput",
- "version": "0.0.0"
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-sfn-tasks-ecs-run-task/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-sfn-tasks-ecs-run-task/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "SfnTasksEcsEc2RunTaskTest": {
- "id": "SfnTasksEcsEc2RunTaskTest",
- "path": "SfnTasksEcsEc2RunTaskTest",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "SfnTasksEcsEc2RunTaskTest/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "SfnTasksEcsEc2RunTaskTest/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "SfnTasksEcsEc2RunTaskTest/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "SfnTasksEcsEc2RunTaskTest/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "SfnTasksEcsEc2RunTaskTest/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-sfn-tasks-ecs-run-task":{"id":"aws-sfn-tasks-ecs-run-task","path":"aws-sfn-tasks-ecs-run-task","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"Ec2Cluster":{"id":"Ec2Cluster","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":["*",{"addCapacity":["*",{"instanceType":"*","vpcSubnets":{"subnetType":"Public"}}]},{"addAutoScalingGroup":["*",{"machineImageType":0}]}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":{}}},"Vpc":{"id":"Vpc","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"Acl":{"id":"Acl","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":"Ec2ClusterVpcPublicSubnet1RouteTableE30610F5"},"subnetId":{"Ref":"Ec2ClusterVpcPublicSubnet1SubnetD46FD92B"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":"Ec2ClusterVpcIGW605638EB"},"routeTableId":{"Ref":"Ec2ClusterVpcPublicSubnet1RouteTableE30610F5"}}}},"EIP":{"id":"EIP","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":["Ec2ClusterVpcPublicSubnet1EIPD4B5D142","AllocationId"]},"subnetId":{"Ref":"Ec2ClusterVpcPublicSubnet1SubnetD46FD92B"},"tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"Acl":{"id":"Acl","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":"Ec2ClusterVpcPublicSubnet2RouteTable44A09188"},"subnetId":{"Ref":"Ec2ClusterVpcPublicSubnet2Subnet207D9E5E"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":"Ec2ClusterVpcIGW605638EB"},"routeTableId":{"Ref":"Ec2ClusterVpcPublicSubnet2RouteTable44A09188"}}}},"EIP":{"id":"EIP","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":["Ec2ClusterVpcPublicSubnet2EIP921925E6","AllocationId"]},"subnetId":{"Ref":"Ec2ClusterVpcPublicSubnet2Subnet207D9E5E"},"tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"Acl":{"id":"Acl","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":"Ec2ClusterVpcPrivateSubnet1RouteTable50D391D1"},"subnetId":{"Ref":"Ec2ClusterVpcPrivateSubnet1Subnet0AE9B91E"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":"Ec2ClusterVpcPublicSubnet1NATGateway79A8A839"},"routeTableId":{"Ref":"Ec2ClusterVpcPrivateSubnet1RouteTable50D391D1"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"Acl":{"id":"Acl","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":"Ec2ClusterVpcPrivateSubnet2RouteTable22B9DAE6"},"subnetId":{"Ref":"Ec2ClusterVpcPrivateSubnet2Subnet16B68C19"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":"Ec2ClusterVpcPublicSubnet2NATGateway302F96C0"},"routeTableId":{"Ref":"Ec2ClusterVpcPrivateSubnet2RouteTable22B9DAE6"}}}}}},"IGW":{"id":"IGW","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":"Ec2ClusterVpcIGW605638EB"},"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}}}},"DefaultAutoScalingGroup":{"id":"DefaultAutoScalingGroup","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","instanceType":"*","vpcSubnets":{"subnetType":"Public"}},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"Ec2ClusterVpc568127F1"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/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":["Ec2ClusterEE43E89D","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"Ec2ClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy6D2DC2FD","roles":[{"Ref":"Ec2ClusterDefaultAutoScalingGroupInstanceRole73D80898"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":"Ec2ClusterDefaultAutoScalingGroupInstanceRole73D80898"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/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":["Ec2ClusterDefaultAutoScalingGroupInstanceProfileDB232471","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["Ec2ClusterDefaultAutoScalingGroupInstanceSecurityGroup149B0A9E","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"Ec2ClusterEE43E89D"}," >> /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-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":"Ec2ClusterDefaultAutoScalingGroupLaunchTemplate346F58BE"},"version":{"Fn::GetAtt":["Ec2ClusterDefaultAutoScalingGroupLaunchTemplate346F58BE","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"Ec2ClusterVpcPublicSubnet1SubnetD46FD92B"},{"Ref":"Ec2ClusterVpcPublicSubnet2Subnet207D9E5E"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/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":"Ec2ClusterDefaultAutoScalingGroupASGC5A6D4C0"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]}}],"Version":"2012-10-17"},"policyName":"Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicy638C9E33","roles":[{"Ref":"Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole23116FA3"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":"Ec2ClusterEE43E89D"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole23116FA3","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awssfntasksecsruntaskEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7B5DFDE":{"id":"AllowInvoke:awssfntasksecsruntaskEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7B5DFDE","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awssfntasksecsruntaskEc2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7B5DFDE","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":["Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionE0DEFB31","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"}}}},"Topic":{"id":"Topic","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/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":["Ec2ClusterDefaultAutoScalingGroupDrainECSHookFunctionE0DEFB31","Arn"]},"protocol":"lambda","topicArn":{"Ref":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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-sfn-tasks-ecs-run-task/Ec2Cluster/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":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"}}],"Version":"2012-10-17"},"policyName":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicyE499974B","roles":[{"Ref":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole71045ED7"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task/Ec2Cluster/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":"Ec2ClusterDefaultAutoScalingGroupASGC5A6D4C0"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopicF7263B30"},"roleArn":{"Fn::GetAtt":["Ec2ClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole71045ED7","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-sfn-tasks-ecs-run-task/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-sfn-tasks-ecs-run-task/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-sfn-tasks-ecs-run-task/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-sfn-tasks-ecs-run-task/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-sfn-tasks-ecs-run-task/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task/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-sfn-tasks-ecs-run-task/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":{"Fn::Sub":"${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:d87af9b5acc567118fa529d3d3b763098200a6446a5ca64aea987729efd52534"},"memory":256,"name":"Container","logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"TaskDefContainerLogGroupB60E6F44"},"awslogs-stream-prefix":"EventDemo","awslogs-region":{"Ref":"AWS::Region"}}}}],"executionRoleArn":{"Fn::GetAtt":["TaskDefExecutionRoleB4775C97","Arn"]},"family":"awssfntasksecsruntaskTaskDef75140181","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"Container":{"id":"Container","path":"aws-sfn-tasks-ecs-run-task/TaskDef/Container","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"AssetImage":{"id":"AssetImage","path":"aws-sfn-tasks-ecs-run-task/TaskDef/Container/AssetImage","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr_assets.DockerImageAsset","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-sfn-tasks-ecs-run-task/TaskDef/Container/AssetImage/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Repository":{"id":"Repository","path":"aws-sfn-tasks-ecs-run-task/TaskDef/Container/AssetImage/Repository","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr.RepositoryBase","version":"0.0.0","metadata":[]}}}},"LogGroup":{"id":"LogGroup","path":"aws-sfn-tasks-ecs-run-task/TaskDef/Container/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task/TaskDef/Container/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-sfn-tasks-ecs-run-task/TaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-sfn-tasks-ecs-run-task/TaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task/TaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-sfn-tasks-ecs-run-task/TaskDef/ExecutionRole/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-sfn-tasks-ecs-run-task/TaskDef/ExecutionRole/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":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Fn::Sub":"cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"}]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"},{"Action":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["TaskDefContainerLogGroupB60E6F44","Arn"]}}],"Version":"2012-10-17"},"policyName":"TaskDefExecutionRoleDefaultPolicy0DBB737A","roles":[{"Ref":"TaskDefExecutionRoleB4775C97"}]}}}}}}}}},"Start":{"id":"Start","path":"aws-sfn-tasks-ecs-run-task/Start","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.Pass","version":"0.0.0"}},"Run":{"id":"Run","path":"aws-sfn-tasks-ecs-run-task/Run","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions_tasks.EcsRunTask","version":"0.0.0"}},"StateMachine":{"id":"StateMachine","path":"aws-sfn-tasks-ecs-run-task/StateMachine","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.StateMachine","version":"0.0.0","metadata":[{"definition":{"id":"*","startState":"*","endStates":"*"}},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"Role":{"id":"Role","path":"aws-sfn-tasks-ecs-run-task/StateMachine/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportRole":{"id":"ImportRole","path":"aws-sfn-tasks-ecs-run-task/StateMachine/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task/StateMachine/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":"states.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-sfn-tasks-ecs-run-task/StateMachine/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task/StateMachine/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":"ecs:RunTask","Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Fn::Select":[1,{"Fn::Split":[":",{"Ref":"TaskDef54694570"}]}]},":",{"Fn::Select":[2,{"Fn::Split":[":",{"Ref":"TaskDef54694570"}]}]},":",{"Fn::Select":[3,{"Fn::Split":[":",{"Ref":"TaskDef54694570"}]}]},":",{"Fn::Select":[4,{"Fn::Split":[":",{"Ref":"TaskDef54694570"}]}]},":",{"Fn::Select":[0,{"Fn::Split":["/",{"Fn::Select":[5,{"Fn::Split":[":",{"Ref":"TaskDef54694570"}]}]}]}]},"/",{"Fn::Select":[1,{"Fn::Split":["/",{"Fn::Select":[5,{"Fn::Split":[":",{"Ref":"TaskDef54694570"}]}]}]}]},":*"]]}},{"Action":["ecs:DescribeTasks","ecs:StopTask"],"Effect":"Allow","Resource":"*"},{"Action":"iam:PassRole","Effect":"Allow","Resource":[{"Fn::GetAtt":["TaskDefExecutionRoleB4775C97","Arn"]},{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}]},{"Action":["events:DescribeRule","events:PutRule","events:PutTargets"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":events:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":rule/StepFunctionsGetEventsForECSTaskRule"]]}}],"Version":"2012-10-17"},"policyName":"StateMachineRoleDefaultPolicyDF1E6607","roles":[{"Ref":"StateMachineRoleB840431D"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-run-task/StateMachine/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.CfnStateMachine","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::StepFunctions::StateMachine","aws:cdk:cloudformation:props":{"definitionString":{"Fn::Join":["",["{\"StartAt\":\"Start\",\"States\":{\"Start\":{\"Type\":\"Pass\",\"Result\":{\"SomeKey\":\"SomeValue\"},\"Next\":\"Run\"},\"Run\":{\"End\":true,\"Type\":\"Task\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::ecs:runTask.sync\",\"Parameters\":{\"Cluster\":\"",{"Fn::GetAtt":["Ec2ClusterEE43E89D","Arn"]},"\",\"TaskDefinition\":\"awssfntasksecsruntaskTaskDef75140181\",\"Overrides\":{\"ContainerOverrides\":[{\"Name\":\"Container\",\"Environment\":[{\"Name\":\"SOME_KEY\",\"Value.$\":\"$.SomeKey\"}]}]},\"LaunchType\":\"EC2\",\"EnableExecuteCommand\":true}}}}"]]},"roleArn":{"Fn::GetAtt":["StateMachineRoleB840431D","Arn"]}}}}}},"stateMachineArn":{"id":"stateMachineArn","path":"aws-sfn-tasks-ecs-run-task/stateMachineArn","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-sfn-tasks-ecs-run-task/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-sfn-tasks-ecs-run-task/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"SfnTasksEcsEc2RunTaskTest":{"id":"SfnTasksEcsEc2RunTaskTest","path":"SfnTasksEcsEc2RunTaskTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"SfnTasksEcsEc2RunTaskTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"SfnTasksEcsEc2RunTaskTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"SfnTasksEcsEc2RunTaskTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"SfnTasksEcsEc2RunTaskTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"SfnTasksEcsEc2RunTaskTest/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-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/SfnTasksEcsEc2TaskTestDefaultTestDeployAssert9E1A388C.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/SfnTasksEcsEc2TaskTestDefaultTestDeployAssert9E1A388C.assets.json
index 10cbcbeb48a33..d46bbb5420e07 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/SfnTasksEcsEc2TaskTestDefaultTestDeployAssert9E1A388C.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/SfnTasksEcsEc2TaskTestDefaultTestDeployAssert9E1A388C.assets.json
@@ -1,13 +1,14 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+ "displayName": "SfnTasksEcsEc2TaskTestDefaultTestDeployAssert9E1A388C Template",
"source": {
"path": "SfnTasksEcsEc2TaskTestDefaultTestDeployAssert9E1A388C.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "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}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/aws-sfn-tasks-ecs-task.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/aws-sfn-tasks-ecs-task.assets.json
index e991d4f3943ec..6459fa87a0440 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/aws-sfn-tasks-ecs-task.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/aws-sfn-tasks-ecs-task.assets.json
@@ -1,15 +1,16 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"files": {
- "3def9ee7b59a962a2c1b87f53788e50585c78f8b28084882a58d0b6796594f37": {
+ "8141a5573a1c8fc4fef495ecbcc1418d42dfb250b54e5a0330b2eabdbf05db44": {
+ "displayName": "aws-sfn-tasks-ecs-task Template",
"source": {
"path": "aws-sfn-tasks-ecs-task.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-9c9a27b0": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "3def9ee7b59a962a2c1b87f53788e50585c78f8b28084882a58d0b6796594f37.json",
+ "objectKey": "8141a5573a1c8fc4fef495ecbcc1418d42dfb250b54e5a0330b2eabdbf05db44.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
@@ -17,11 +18,12 @@
},
"dockerImages": {
"d87af9b5acc567118fa529d3d3b763098200a6446a5ca64aea987729efd52534": {
+ "displayName": "TaskDef/Container/AssetImage",
"source": {
"directory": "asset.d87af9b5acc567118fa529d3d3b763098200a6446a5ca64aea987729efd52534"
},
"destinations": {
- "current_account-current_region": {
+ "current_account-current_region-dd0fae61": {
"repositoryName": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}",
"imageTag": "d87af9b5acc567118fa529d3d3b763098200a6446a5ca64aea987729efd52534",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-image-publishing-role-${AWS::AccountId}-${AWS::Region}"
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/aws-sfn-tasks-ecs-task.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/aws-sfn-tasks-ecs-task.template.json
index 5f3399c06dfee..57da5726bfc5c 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/aws-sfn-tasks-ecs-task.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/aws-sfn-tasks-ecs-task.template.json
@@ -755,7 +755,7 @@
"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('Got event without EC2InstanceId: %s', 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"
+ "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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/cdk.out
index 91e1a8b9901d5..3704a1b682acf 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"39.0.0"}
\ No newline at end of file
+{"version":"45.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/integ.json
index a58e5573ec596..9af79caf66890 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/integ.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "45.0.0",
"testCases": {
"SfnTasksEcsEc2TaskTest/DefaultTest": {
"stacks": [
@@ -8,5 +8,6 @@
"assertionStack": "SfnTasksEcsEc2TaskTest/DefaultTest/DeployAssert",
"assertionStackName": "SfnTasksEcsEc2TaskTestDefaultTestDeployAssert9E1A388C"
}
- }
+ },
+ "minimumCliVersion": "2.1020.2"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/manifest.json
index 8a6558e29ca42..4b5684f0f4d8f 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "39.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-sfn-tasks-ecs-task.assets": {
"type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
"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}/3def9ee7b59a962a2c1b87f53788e50585c78f8b28084882a58d0b6796594f37.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/8141a5573a1c8fc4fef495ecbcc1418d42dfb250b54e5a0330b2eabdbf05db44.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1284,51 +1284,6 @@
"type": "aws:cdk:logicalId",
"data": "CheckBootstrapVersion"
}
- ],
- "FargateClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole07DEB0033": [
- {
- "type": "aws:cdk:logicalId",
- "data": "FargateClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole07DEB0033",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "FargateClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19C1F9F76": [
- {
- "type": "aws:cdk:logicalId",
- "data": "FargateClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole19C1F9F76",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "FargateClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole204A3CD4E": [
- {
- "type": "aws:cdk:logicalId",
- "data": "FargateClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole204A3CD4E",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "FargateClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole344578453": [
- {
- "type": "aws:cdk:logicalId",
- "data": "FargateClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole344578453",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
- ],
- "FargateClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole465531B88": [
- {
- "type": "aws:cdk:logicalId",
- "data": "FargateClusterDefaultAutoScalingGroupDrainECSHookFunctioninlinePolicyAddedToExecutionRole465531B88",
- "trace": [
- "!!DESTRUCTIVE_CHANGES: WILL_DESTROY"
- ]
- }
]
},
"displayName": "aws-sfn-tasks-ecs-task"
@@ -1386,6 +1341,476 @@
"properties": {
"file": "tree.json"
}
+ },
+ "aws-cdk-lib/feature-flag-report": {
+ "type": "cdk:feature-flag-report",
+ "properties": {
+ "module": "aws-cdk-lib",
+ "flags": {
+ "@aws-cdk/core:enableStackNameDuplicates": {
+ "recommendedValue": true,
+ "explanation": "Allow multiple stacks with the same name"
+ },
+ "aws-cdk:enableDiffNoFail": {
+ "recommendedValue": true,
+ "explanation": "Make `cdk diff` not fail when there are differences"
+ },
+ "@aws-cdk/core:newStyleStackSynthesis": {
+ "recommendedValue": true,
+ "explanation": "Switch to new stack synthesis method which enables CI/CD"
+ },
+ "@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"
+ },
+ "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": {
+ "recommendedValue": true,
+ "explanation": "Do not specify a default DesiredCount for ECS services"
+ },
+ "@aws-cdk/aws-rds:lowercaseDbIdentifier": {
+ "recommendedValue": true,
+ "explanation": "Force lowercasing of RDS Cluster names in CDK"
+ },
+ "@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."
+ },
+ "@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`."
+ },
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:checkSecretUsage": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations"
+ },
+ "@aws-cdk/core:target-partitions": {
+ "recommendedValue": [
+ "aws",
+ "aws-cn"
+ ],
+ "explanation": "What regions to include in lookup tables of environment agnostic stacks"
+ },
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified"
+ },
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names."
+ },
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID."
+ },
+ "@aws-cdk/aws-iam:minimizePolicies": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Minimize IAM policies by combining Statements"
+ },
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Error on snapshot removal policies on resources that do not support it."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate key aliases that include the stack name"
+ },
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist."
+ },
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict KMS key policy for encrypted Queues a bit more"
+ },
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment"
+ },
+ "@aws-cdk/core:enablePartitionLiterals": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Make ARNs concrete if AWS partition is known"
+ },
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Event Rules may only push to encrypted SQS queues in the same account"
+ },
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker"
+ },
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in."
+ },
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging"
+ },
+ "@aws-cdk/aws-route53-patters:useCertificate": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`"
+ },
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "Whether to install the latest SDK by default in AwsCustomResource"
+ },
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Use unique resource name for Database Proxy"
+ },
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Remove CloudWatch alarms from deployment group"
+ },
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID."
+ },
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Define user data for a launch template by default when a machine image is provided."
+ },
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret."
+ },
+ "@aws-cdk/aws-redshift:columnId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Whether to use an ID to track Redshift column changes"
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies"
+ },
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Restrict access to the VPC default security group"
+ },
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a unique id for each RequestValidator added to a method"
+ },
+ "@aws-cdk/aws-kms:aliasNameRef": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key"
+ },
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition"
+ },
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Generate a launch template when creating an AutoScalingGroup"
+ },
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Include the stack prefix in the stack name generation process"
+ },
+ "@aws-cdk/aws-efs:denyAnonymousAccess": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "EFS denies anonymous clients accesses"
+ },
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains"
+ },
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default"
+ },
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet."
+ },
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change."
+ },
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id."
+ },
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials."
+ },
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'."
+ },
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID."
+ },
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false."
+ },
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Enables Pipeline to set the default pipeline type to V2."
+ },
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only."
+ },
+ "@aws-cdk/pipelines:reduceAssetRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy"
+ },
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix."
+ },
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default volume type of the EBS volume will be GP3"
+ },
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, remove default deployment alarm settings"
+ },
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default"
+ },
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack."
+ },
+ "@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."
+ },
+ "@aws-cdk/core:explicitStackTags": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack."
+ },
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**"
+ },
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**"
+ },
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration"
+ },
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas"
+ },
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together."
+ },
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn."
+ },
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`"
+ },
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values."
+ },
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications."
+ },
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN."
+ },
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2."
+ },
+ "@aws-cdk/core:aspectStabilization": {
+ "recommendedValue": true,
+ "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis."
+ },
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource."
+ },
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere"
+ },
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections"
+ },
+ "@aws-cdk/core:enableAdditionalMetadataCollection": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues."
+ },
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": {
+ "userValue": false,
+ "recommendedValue": false,
+ "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement"
+ },
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication."
+ },
+ "@aws-cdk/pipelines:reduceStageRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "Remove the root account principal from Stage addActions trust policy"
+ },
+ "@aws-cdk/aws-events:requireEventBusPolicySid": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals."
+ },
+ "@aws-cdk/core:aspectPrioritiesMutating": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING."
+ },
+ "@aws-cdk/aws-dynamodb:retainTableReplica": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise."
+ },
+ "@aws-cdk/cognito:logUserPoolClientSecretValue": {
+ "recommendedValue": false,
+ "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs."
+ },
+ "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": {
+ "recommendedValue": true,
+ "explanation": "When enabled, scopes down the trust policy for the cross-account action role"
+ },
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter"
+ },
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions."
+ },
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC."
+ },
+ "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": {
+ "recommendedValue": false,
+ "explanation": "When enabled, use resource IDs for VPC V2 migration"
+ },
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": {
+ "userValue": true,
+ "recommendedValue": true,
+ "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined."
+ },
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": {
+ "userValue": false,
+ "recommendedValue": true,
+ "explanation": "When enabled, CDK creates and manages loggroup for the lambda function"
+ }
+ }
+ }
}
- }
+ },
+ "minimumCliVersion": "2.1023.0"
}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/tree.json
index c9daee9cb7526..ad9a2a97e1cfd 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-stepfunctions-tasks/test/ecs/integ.ec2-task.js.snapshot/tree.json
@@ -1,2667 +1 @@
-{
- "version": "tree-0.1",
- "tree": {
- "id": "App",
- "path": "",
- "children": {
- "aws-sfn-tasks-ecs-task": {
- "id": "aws-sfn-tasks-ecs-task",
- "path": "aws-sfn-tasks-ecs-task",
- "children": {
- "FargateCluster": {
- "id": "FargateCluster",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::Cluster",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnCluster",
- "version": "0.0.0"
- }
- },
- "Vpc": {
- "id": "Vpc",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/Resource",
- "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-sfn-tasks-ecs-task/FargateCluster/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
- "version": "0.0.0"
- }
- },
- "PublicSubnet1": {
- "id": "PublicSubnet1",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1/Subnet",
- "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-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "FargateClusterVpc377E8024"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "FargateClusterVpc377E8024"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "FargateClusterVpcPublicSubnet1RouteTable1D7FA747"
- },
- "subnetId": {
- "Ref": "FargateClusterVpcPublicSubnet1SubnetB9C24BC7"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "FargateClusterVpcIGW827638CB"
- },
- "routeTableId": {
- "Ref": "FargateClusterVpcPublicSubnet1RouteTable1D7FA747"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "FargateClusterVpcPublicSubnet1EIPF91909D0",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "FargateClusterVpcPublicSubnet1SubnetB9C24BC7"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PublicSubnet2": {
- "id": "PublicSubnet2",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2/Subnet",
- "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-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "FargateClusterVpc377E8024"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "FargateClusterVpc377E8024"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "FargateClusterVpcPublicSubnet2RouteTable1493C5D6"
- },
- "subnetId": {
- "Ref": "FargateClusterVpcPublicSubnet2Subnet24C0F9D8"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "gatewayId": {
- "Ref": "FargateClusterVpcIGW827638CB"
- },
- "routeTableId": {
- "Ref": "FargateClusterVpcPublicSubnet2RouteTable1493C5D6"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- },
- "EIP": {
- "id": "EIP",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2/EIP",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
- "aws:cdk:cloudformation:props": {
- "domain": "vpc",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
- "version": "0.0.0"
- }
- },
- "NATGateway": {
- "id": "NATGateway",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2/NATGateway",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
- "aws:cdk:cloudformation:props": {
- "allocationId": {
- "Fn::GetAtt": [
- "FargateClusterVpcPublicSubnet2EIPBBB24774",
- "AllocationId"
- ]
- },
- "subnetId": {
- "Ref": "FargateClusterVpcPublicSubnet2Subnet24C0F9D8"
- },
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
- "version": "0.0.0"
- }
- }
- },
- "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": [
- "*"
- ]
- }
- ]
- }
- },
- "PrivateSubnet1": {
- "id": "PrivateSubnet1",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet1",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet1/Subnet",
- "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-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "FargateClusterVpc377E8024"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet1/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet1/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet1"
- }
- ],
- "vpcId": {
- "Ref": "FargateClusterVpc377E8024"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet1/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "FargateClusterVpcPrivateSubnet1RouteTable21B3CEAE"
- },
- "subnetId": {
- "Ref": "FargateClusterVpcPrivateSubnet1Subnet9127625F"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet1/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "FargateClusterVpcPublicSubnet1NATGateway5202D86A"
- },
- "routeTableId": {
- "Ref": "FargateClusterVpcPrivateSubnet1RouteTable21B3CEAE"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "PrivateSubnet2": {
- "id": "PrivateSubnet2",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet2",
- "children": {
- "Subnet": {
- "id": "Subnet",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet2/Subnet",
- "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-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "FargateClusterVpc377E8024"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
- "version": "0.0.0"
- }
- },
- "Acl": {
- "id": "Acl",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet2/Acl",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "RouteTable": {
- "id": "RouteTable",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet2/RouteTable",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet2"
- }
- ],
- "vpcId": {
- "Ref": "FargateClusterVpc377E8024"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
- "version": "0.0.0"
- }
- },
- "RouteTableAssociation": {
- "id": "RouteTableAssociation",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet2/RouteTableAssociation",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
- "aws:cdk:cloudformation:props": {
- "routeTableId": {
- "Ref": "FargateClusterVpcPrivateSubnet2RouteTable7B7F9678"
- },
- "subnetId": {
- "Ref": "FargateClusterVpcPrivateSubnet2Subnet307CEE57"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
- "version": "0.0.0"
- }
- },
- "DefaultRoute": {
- "id": "DefaultRoute",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet2/DefaultRoute",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::Route",
- "aws:cdk:cloudformation:props": {
- "destinationCidrBlock": "0.0.0.0/0",
- "natGatewayId": {
- "Ref": "FargateClusterVpcPublicSubnet2NATGatewayFFEC8ED2"
- },
- "routeTableId": {
- "Ref": "FargateClusterVpcPrivateSubnet2RouteTable7B7F9678"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
- "version": "0.0.0"
- }
- }
- },
- "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": "*"
- },
- {}
- ]
- }
- },
- "IGW": {
- "id": "IGW",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/IGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
- "version": "0.0.0"
- }
- },
- "VPCGW": {
- "id": "VPCGW",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/Vpc/VPCGW",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
- "aws:cdk:cloudformation:props": {
- "internetGatewayId": {
- "Ref": "FargateClusterVpcIGW827638CB"
- },
- "vpcId": {
- "Ref": "FargateClusterVpc377E8024"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.Vpc",
- "version": "0.0.0",
- "metadata": [
- {
- "maxAzs": "*"
- }
- ]
- }
- },
- "DefaultAutoScalingGroup": {
- "id": "DefaultAutoScalingGroup",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup",
- "children": {
- "InstanceSecurityGroup": {
- "id": "InstanceSecurityGroup",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/InstanceSecurityGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
- "aws:cdk:cloudformation:props": {
- "groupDescription": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/InstanceSecurityGroup",
- "securityGroupEgress": [
- {
- "cidrIp": "0.0.0.0/0",
- "description": "Allow all outbound traffic by default",
- "ipProtocol": "-1"
- }
- ],
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup"
- }
- ],
- "vpcId": {
- "Ref": "FargateClusterVpc377E8024"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "allowAllOutbound": true
- }
- ]
- }
- },
- "InstanceRole": {
- "id": "InstanceRole",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/InstanceRole",
- "children": {
- "ImportInstanceRole": {
- "id": "ImportInstanceRole",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/InstanceRole/Resource",
- "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-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/InstanceRole/DefaultPolicy/Resource",
- "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": [
- "FargateCluster7CCD5F93",
- "Arn"
- ]
- }
- },
- {
- "Action": [
- "ecs:Poll",
- "ecs:StartTelemetrySession"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "FargateCluster7CCD5F93",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecr:GetAuthorizationToken",
- "ecs:DiscoverPollEndpoint",
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": "*"
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "FargateClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy3BD78F3E",
- "roles": [
- {
- "Ref": "FargateClusterDefaultAutoScalingGroupInstanceRole0C1F7FF7"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "roleName": "*",
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "InstanceProfile": {
- "id": "InstanceProfile",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/InstanceProfile",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile",
- "aws:cdk:cloudformation:props": {
- "roles": [
- {
- "Ref": "FargateClusterDefaultAutoScalingGroupInstanceRole0C1F7FF7"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile",
- "version": "0.0.0"
- }
- },
- "ImportedInstanceProfile": {
- "id": "ImportedInstanceProfile",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/ImportedInstanceProfile",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": []
- }
- },
- "LaunchTemplate": {
- "id": "LaunchTemplate",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LaunchTemplate",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LaunchTemplate/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::EC2::LaunchTemplate",
- "aws:cdk:cloudformation:props": {
- "launchTemplateData": {
- "iamInstanceProfile": {
- "arn": {
- "Fn::GetAtt": [
- "FargateClusterDefaultAutoScalingGroupInstanceProfile2C0FEF3B",
- "Arn"
- ]
- }
- },
- "imageId": {
- "Ref": "SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
- },
- "instanceType": "t2.micro",
- "monitoring": {
- "enabled": false
- },
- "securityGroupIds": [
- {
- "Fn::GetAtt": [
- "FargateClusterDefaultAutoScalingGroupInstanceSecurityGroup42AF8A40",
- "GroupId"
- ]
- }
- ],
- "tagSpecifications": [
- {
- "resourceType": "instance",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- },
- {
- "resourceType": "volume",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ],
- "userData": {
- "Fn::Base64": {
- "Fn::Join": [
- "",
- [
- "#!/bin/bash\necho ECS_CLUSTER=",
- {
- "Ref": "FargateCluster7CCD5F93"
- },
- " >> /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-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LaunchTemplate"
- }
- ]
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.CfnLaunchTemplate",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ec2.LaunchTemplate",
- "version": "0.0.0",
- "metadata": [
- {
- "machineImage": "*",
- "instanceType": "*",
- "detailedMonitoring": false,
- "securityGroup": "*",
- "userData": "*",
- "associatePublicIpAddress": "*",
- "spotOptions": "*",
- "blockDevices": "*",
- "instanceProfile": "*",
- "keyPair": "*"
- }
- ]
- }
- },
- "ASG": {
- "id": "ASG",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/ASG",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::AutoScalingGroup",
- "aws:cdk:cloudformation:props": {
- "launchTemplate": {
- "launchTemplateId": {
- "Ref": "FargateClusterDefaultAutoScalingGroupLaunchTemplate7BE88B5A"
- },
- "version": {
- "Fn::GetAtt": [
- "FargateClusterDefaultAutoScalingGroupLaunchTemplate7BE88B5A",
- "LatestVersionNumber"
- ]
- }
- },
- "maxSize": "1",
- "minSize": "1",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup",
- "propagateAtLaunch": true
- }
- ],
- "vpcZoneIdentifier": [
- {
- "Ref": "FargateClusterVpcPublicSubnet1SubnetB9C24BC7"
- },
- {
- "Ref": "FargateClusterVpcPublicSubnet2Subnet24C0F9D8"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnAutoScalingGroup",
- "version": "0.0.0"
- }
- },
- "DrainECSHook": {
- "id": "DrainECSHook",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/DrainECSHook",
- "children": {
- "Function": {
- "id": "Function",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/DrainECSHook/Function",
- "children": {
- "ServiceRole": {
- "id": "ServiceRole",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole",
- "children": {
- "ImportServiceRole": {
- "id": "ImportServiceRole",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/Resource",
- "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-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/DefaultPolicy/Resource",
- "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": "FargateClusterDefaultAutoScalingGroupASG36A4948F"
- }
- ]
- ]
- }
- },
- {
- "Action": [
- "ecs:DescribeContainerInstances",
- "ecs:DescribeTasks",
- "ecs:ListTasks",
- "ecs:UpdateContainerInstancesState"
- ],
- "Condition": {
- "ArnEquals": {
- "ecs:cluster": {
- "Fn::GetAtt": [
- "FargateCluster7CCD5F93",
- "Arn"
- ]
- }
- }
- },
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "ecs:ListContainerInstances",
- "ecs:SubmitContainerStateChange",
- "ecs:SubmitTaskStateChange"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "FargateCluster7CCD5F93",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "FargateClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicyB91C5343",
- "roles": [
- {
- "Ref": "FargateClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole7FEDCD32"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "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": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Resource",
- "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('Got event without EC2InstanceId: %s', 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": "FargateCluster7CCD5F93"
- }
- }
- },
- "handler": "index.lambda_handler",
- "role": {
- "Fn::GetAtt": [
- "FargateClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole7FEDCD32",
- "Arn"
- ]
- },
- "runtime": "python3.9",
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup"
- }
- ],
- "timeout": 310
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnFunction",
- "version": "0.0.0"
- }
- },
- "AllowInvoke:awssfntasksecstaskFargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic9B632D13": {
- "id": "AllowInvoke:awssfntasksecstaskFargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic9B632D13",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awssfntasksecstaskFargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic9B632D13",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Lambda::Permission",
- "aws:cdk:cloudformation:props": {
- "action": "lambda:InvokeFunction",
- "functionName": {
- "Fn::GetAtt": [
- "FargateClusterDefaultAutoScalingGroupDrainECSHookFunctionE3D5BEE8",
- "Arn"
- ]
- },
- "principal": "sns.amazonaws.com",
- "sourceArn": {
- "Ref": "FargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic49146C10"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.CfnPermission",
- "version": "0.0.0"
- }
- },
- "Topic": {
- "id": "Topic",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/DrainECSHook/Function/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Subscription",
- "aws:cdk:cloudformation:props": {
- "endpoint": {
- "Fn::GetAtt": [
- "FargateClusterDefaultAutoScalingGroupDrainECSHookFunctionE3D5BEE8",
- "Arn"
- ]
- },
- "protocol": "lambda",
- "topicArn": {
- "Ref": "FargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic49146C10"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnSubscription",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Subscription",
- "version": "0.0.0",
- "metadata": [
- {
- "topic": "*",
- "endpoint": "*",
- "protocol": "lambda",
- "filterPolicy": "*",
- "filterPolicyWithMessageBody": "*",
- "region": "*",
- "deadLetterQueue": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_lambda.Function",
- "version": "0.0.0",
- "metadata": [
- {
- "code": "*",
- "handler": "*",
- "runtime": "*",
- "timeout": "*",
- "environment": "*"
- },
- {
- "addEnvironment": [
- "*",
- "*"
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "LifecycleHookDrainHook": {
- "id": "LifecycleHookDrainHook",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook",
- "children": {
- "Topic": {
- "id": "Topic",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::SNS::Topic",
- "aws:cdk:cloudformation:props": {
- "tags": [
- {
- "key": "Name",
- "value": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.CfnTopic",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_sns.Topic",
- "version": "0.0.0",
- "metadata": [
- {
- "masterKey": "*"
- }
- ]
- }
- },
- "Role": {
- "id": "Role",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/Resource",
- "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-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "sns:Publish",
- "Effect": "Allow",
- "Resource": {
- "Ref": "FargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic49146C10"
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "FargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicy4958D19D",
- "roles": [
- {
- "Ref": "FargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole410D556D"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::AutoScaling::LifecycleHook",
- "aws:cdk:cloudformation:props": {
- "autoScalingGroupName": {
- "Ref": "FargateClusterDefaultAutoScalingGroupASG36A4948F"
- },
- "defaultResult": "CONTINUE",
- "heartbeatTimeout": 300,
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "notificationTargetArn": {
- "Ref": "FargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic49146C10"
- },
- "roleArn": {
- "Fn::GetAtt": [
- "FargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole410D556D",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.CfnLifecycleHook",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.LifecycleHook",
- "version": "0.0.0",
- "metadata": [
- {
- "autoScalingGroup": "*",
- "lifecycleTransition": "autoscaling:EC2_INSTANCE_TERMINATING",
- "defaultResult": "CONTINUE",
- "notificationTarget": "*",
- "heartbeatTimeout": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_autoscaling.AutoScalingGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "vpc": "*",
- "machineImage": "*",
- "updateType": "Replace",
- "instanceType": "*",
- "vpcSubnets": {
- "subnetType": "Public"
- }
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addUserData": [
- "*"
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Cluster",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "addCapacity": [
- "*",
- {
- "instanceType": "*",
- "vpcSubnets": {
- "subnetType": "Public"
- }
- }
- ]
- },
- {
- "addAutoScalingGroup": [
- "*",
- {
- "machineImageType": 0
- }
- ]
- }
- ]
- }
- },
- "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-sfn-tasks-ecs-task/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-sfn-tasks-ecs-task/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-sfn-tasks-ecs-task/TaskDef",
- "children": {
- "TaskRole": {
- "id": "TaskRole",
- "path": "aws-sfn-tasks-ecs-task/TaskDef/TaskRole",
- "children": {
- "ImportTaskRole": {
- "id": "ImportTaskRole",
- "path": "aws-sfn-tasks-ecs-task/TaskDef/TaskRole/ImportTaskRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/TaskDef/TaskRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/TaskDef/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::ECS::TaskDefinition",
- "aws:cdk:cloudformation:props": {
- "containerDefinitions": [
- {
- "essential": true,
- "image": {
- "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:d87af9b5acc567118fa529d3d3b763098200a6446a5ca64aea987729efd52534"
- },
- "memory": 256,
- "name": "Container",
- "logConfiguration": {
- "logDriver": "awslogs",
- "options": {
- "awslogs-group": {
- "Ref": "TaskDefContainerLogGroupB60E6F44"
- },
- "awslogs-stream-prefix": "EventDemo",
- "awslogs-region": {
- "Ref": "AWS::Region"
- }
- }
- }
- }
- ],
- "executionRoleArn": {
- "Fn::GetAtt": [
- "TaskDefExecutionRoleB4775C97",
- "Arn"
- ]
- },
- "family": "awssfntasksecstaskTaskDefE541322D",
- "networkMode": "bridge",
- "requiresCompatibilities": [
- "EC2"
- ],
- "taskRoleArn": {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.CfnTaskDefinition",
- "version": "0.0.0"
- }
- },
- "Container": {
- "id": "Container",
- "path": "aws-sfn-tasks-ecs-task/TaskDef/Container",
- "children": {
- "AssetImage": {
- "id": "AssetImage",
- "path": "aws-sfn-tasks-ecs-task/TaskDef/Container/AssetImage",
- "children": {
- "Staging": {
- "id": "Staging",
- "path": "aws-sfn-tasks-ecs-task/TaskDef/Container/AssetImage/Staging",
- "constructInfo": {
- "fqn": "aws-cdk-lib.AssetStaging",
- "version": "0.0.0"
- }
- },
- "Repository": {
- "id": "Repository",
- "path": "aws-sfn-tasks-ecs-task/TaskDef/Container/AssetImage/Repository",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr.RepositoryBase",
- "version": "0.0.0",
- "metadata": []
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecr_assets.DockerImageAsset",
- "version": "0.0.0"
- }
- },
- "LogGroup": {
- "id": "LogGroup",
- "path": "aws-sfn-tasks-ecs-task/TaskDef/Container/LogGroup",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/TaskDef/Container/LogGroup/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::Logs::LogGroup",
- "aws:cdk:cloudformation:props": {}
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.CfnLogGroup",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_logs.LogGroup",
- "version": "0.0.0",
- "metadata": [
- {
- "retention": "*"
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.ContainerDefinition",
- "version": "0.0.0"
- }
- },
- "ExecutionRole": {
- "id": "ExecutionRole",
- "path": "aws-sfn-tasks-ecs-task/TaskDef/ExecutionRole",
- "children": {
- "ImportExecutionRole": {
- "id": "ImportExecutionRole",
- "path": "aws-sfn-tasks-ecs-task/TaskDef/ExecutionRole/ImportExecutionRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/TaskDef/ExecutionRole/Resource",
- "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"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-sfn-tasks-ecs-task/TaskDef/ExecutionRole/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/TaskDef/ExecutionRole/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": [
- "ecr:BatchCheckLayerAvailability",
- "ecr:BatchGetImage",
- "ecr:GetDownloadUrlForLayer"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":ecr:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":repository/",
- {
- "Fn::Sub": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"
- }
- ]
- ]
- }
- },
- {
- "Action": "ecr:GetAuthorizationToken",
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "logs:CreateLogStream",
- "logs:PutLogEvents"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::GetAtt": [
- "TaskDefContainerLogGroupB60E6F44",
- "Arn"
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "TaskDefExecutionRoleDefaultPolicy0DBB737A",
- "roles": [
- {
- "Ref": "TaskDefExecutionRoleB4775C97"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- },
- "roleName": "*"
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_ecs.Ec2TaskDefinition",
- "version": "0.0.0",
- "metadata": [
- "*",
- "*",
- "*",
- "*",
- "*"
- ]
- }
- },
- "Start": {
- "id": "Start",
- "path": "aws-sfn-tasks-ecs-task/Start",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_stepfunctions.Pass",
- "version": "0.0.0"
- }
- },
- "Run": {
- "id": "Run",
- "path": "aws-sfn-tasks-ecs-task/Run",
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_stepfunctions.Task",
- "version": "0.0.0"
- }
- },
- "StateMachine": {
- "id": "StateMachine",
- "path": "aws-sfn-tasks-ecs-task/StateMachine",
- "children": {
- "Role": {
- "id": "Role",
- "path": "aws-sfn-tasks-ecs-task/StateMachine/Role",
- "children": {
- "ImportRole": {
- "id": "ImportRole",
- "path": "aws-sfn-tasks-ecs-task/StateMachine/Role/ImportRole",
- "constructInfo": {
- "fqn": "aws-cdk-lib.Resource",
- "version": "0.0.0",
- "metadata": [
- "*"
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/StateMachine/Role/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Role",
- "aws:cdk:cloudformation:props": {
- "assumeRolePolicyDocument": {
- "Statement": [
- {
- "Action": "sts:AssumeRole",
- "Effect": "Allow",
- "Principal": {
- "Service": "states.amazonaws.com"
- }
- }
- ],
- "Version": "2012-10-17"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnRole",
- "version": "0.0.0"
- }
- },
- "DefaultPolicy": {
- "id": "DefaultPolicy",
- "path": "aws-sfn-tasks-ecs-task/StateMachine/Role/DefaultPolicy",
- "children": {
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/StateMachine/Role/DefaultPolicy/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::IAM::Policy",
- "aws:cdk:cloudformation:props": {
- "policyDocument": {
- "Statement": [
- {
- "Action": "ecs:RunTask",
- "Effect": "Allow",
- "Resource": {
- "Ref": "TaskDef54694570"
- }
- },
- {
- "Action": [
- "ecs:DescribeTasks",
- "ecs:StopTask"
- ],
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": "iam:PassRole",
- "Effect": "Allow",
- "Resource": [
- {
- "Fn::GetAtt": [
- "TaskDefExecutionRoleB4775C97",
- "Arn"
- ]
- },
- {
- "Fn::GetAtt": [
- "TaskDefTaskRole1EDB4A67",
- "Arn"
- ]
- }
- ]
- },
- {
- "Action": [
- "events:DescribeRule",
- "events:PutRule",
- "events:PutTargets"
- ],
- "Effect": "Allow",
- "Resource": {
- "Fn::Join": [
- "",
- [
- "arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":events:",
- {
- "Ref": "AWS::Region"
- },
- ":",
- {
- "Ref": "AWS::AccountId"
- },
- ":rule/StepFunctionsGetEventsForECSTaskRule"
- ]
- ]
- }
- }
- ],
- "Version": "2012-10-17"
- },
- "policyName": "StateMachineRoleDefaultPolicyDF1E6607",
- "roles": [
- {
- "Ref": "StateMachineRoleB840431D"
- }
- ]
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.CfnPolicy",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Policy",
- "version": "0.0.0",
- "metadata": [
- "*",
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "attachToRole": [
- "*"
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- },
- {
- "addStatements": [
- {}
- ]
- }
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_iam.Role",
- "version": "0.0.0",
- "metadata": [
- {
- "assumedBy": {
- "principalAccount": "*",
- "assumeRoleAction": "*"
- }
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "attachInlinePolicy": [
- "*"
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- },
- {
- "addToPrincipalPolicy": [
- {}
- ]
- }
- ]
- }
- },
- "Resource": {
- "id": "Resource",
- "path": "aws-sfn-tasks-ecs-task/StateMachine/Resource",
- "attributes": {
- "aws:cdk:cloudformation:type": "AWS::StepFunctions::StateMachine",
- "aws:cdk:cloudformation:props": {
- "definitionString": {
- "Fn::Join": [
- "",
- [
- "{\"StartAt\":\"Start\",\"States\":{\"Start\":{\"Type\":\"Pass\",\"Result\":{\"SomeKey\":\"SomeValue\"},\"Next\":\"Run\"},\"Run\":{\"End\":true,\"Parameters\":{\"Cluster\":\"",
- {
- "Fn::GetAtt": [
- "FargateCluster7CCD5F93",
- "Arn"
- ]
- },
- "\",\"TaskDefinition\":\"",
- {
- "Ref": "TaskDef54694570"
- },
- "\",\"Overrides\":{\"ContainerOverrides\":[{\"Name\":\"Container\",\"Environment\":[{\"Name\":\"SOME_KEY\",\"Value.$\":\"$.SomeKey\"}]}]},\"LaunchType\":\"EC2\"},\"Type\":\"Task\",\"Resource\":\"arn:",
- {
- "Ref": "AWS::Partition"
- },
- ":states:::ecs:runTask.sync\"}}}"
- ]
- ]
- },
- "roleArn": {
- "Fn::GetAtt": [
- "StateMachineRoleB840431D",
- "Arn"
- ]
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_stepfunctions.CfnStateMachine",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.aws_stepfunctions.StateMachine",
- "version": "0.0.0",
- "metadata": [
- {
- "definition": {
- "id": "*",
- "startState": "*",
- "endStates": "*"
- }
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- },
- {
- "addToRolePolicy": [
- {}
- ]
- }
- ]
- }
- },
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "aws-sfn-tasks-ecs-task/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "aws-sfn-tasks-ecs-task/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- },
- "SfnTasksEcsEc2TaskTest": {
- "id": "SfnTasksEcsEc2TaskTest",
- "path": "SfnTasksEcsEc2TaskTest",
- "children": {
- "DefaultTest": {
- "id": "DefaultTest",
- "path": "SfnTasksEcsEc2TaskTest/DefaultTest",
- "children": {
- "Default": {
- "id": "Default",
- "path": "SfnTasksEcsEc2TaskTest/DefaultTest/Default",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- },
- "DeployAssert": {
- "id": "DeployAssert",
- "path": "SfnTasksEcsEc2TaskTest/DefaultTest/DeployAssert",
- "children": {
- "BootstrapVersion": {
- "id": "BootstrapVersion",
- "path": "SfnTasksEcsEc2TaskTest/DefaultTest/DeployAssert/BootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnParameter",
- "version": "0.0.0"
- }
- },
- "CheckBootstrapVersion": {
- "id": "CheckBootstrapVersion",
- "path": "SfnTasksEcsEc2TaskTest/DefaultTest/DeployAssert/CheckBootstrapVersion",
- "constructInfo": {
- "fqn": "aws-cdk-lib.CfnRule",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.Stack",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
- "version": "0.0.0"
- }
- }
- },
- "constructInfo": {
- "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
- "version": "0.0.0"
- }
- },
- "Tree": {
- "id": "Tree",
- "path": "Tree",
- "constructInfo": {
- "fqn": "constructs.Construct",
- "version": "10.4.2"
- }
- }
- },
- "constructInfo": {
- "fqn": "aws-cdk-lib.App",
- "version": "0.0.0"
- }
- }
-}
\ 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":{"aws-sfn-tasks-ecs-task":{"id":"aws-sfn-tasks-ecs-task","path":"aws-sfn-tasks-ecs-task","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"FargateCluster":{"id":"FargateCluster","path":"aws-sfn-tasks-ecs-task/FargateCluster","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":["*",{"addCapacity":["*",{"instanceType":"*","vpcSubnets":{"subnetType":"Public"}}]},{"addAutoScalingGroup":["*",{"machineImageType":0}]}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":{}}},"Vpc":{"id":"Vpc","path":"aws-sfn-tasks-ecs-task/FargateCluster/Vpc","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/Vpc"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"FargateClusterVpc377E8024"}}}},"Acl":{"id":"Acl","path":"aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"FargateClusterVpc377E8024"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":"FargateClusterVpcPublicSubnet1RouteTable1D7FA747"},"subnetId":{"Ref":"FargateClusterVpcPublicSubnet1SubnetB9C24BC7"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":"FargateClusterVpcIGW827638CB"},"routeTableId":{"Ref":"FargateClusterVpcPublicSubnet1RouteTable1D7FA747"}}}},"EIP":{"id":"EIP","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":["FargateClusterVpcPublicSubnet1EIPF91909D0","AllocationId"]},"subnetId":{"Ref":"FargateClusterVpcPublicSubnet1SubnetB9C24BC7"},"tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"FargateClusterVpc377E8024"}}}},"Acl":{"id":"Acl","path":"aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"FargateClusterVpc377E8024"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":"FargateClusterVpcPublicSubnet2RouteTable1493C5D6"},"subnetId":{"Ref":"FargateClusterVpcPublicSubnet2Subnet24C0F9D8"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":"FargateClusterVpcIGW827638CB"},"routeTableId":{"Ref":"FargateClusterVpcPublicSubnet2RouteTable1493C5D6"}}}},"EIP":{"id":"EIP","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":["FargateClusterVpcPublicSubnet2EIPBBB24774","AllocationId"]},"subnetId":{"Ref":"FargateClusterVpcPublicSubnet2Subnet24C0F9D8"},"tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"FargateClusterVpc377E8024"}}}},"Acl":{"id":"Acl","path":"aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"FargateClusterVpc377E8024"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":"FargateClusterVpcPrivateSubnet1RouteTable21B3CEAE"},"subnetId":{"Ref":"FargateClusterVpcPrivateSubnet1Subnet9127625F"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":"FargateClusterVpcPublicSubnet1NATGateway5202D86A"},"routeTableId":{"Ref":"FargateClusterVpcPrivateSubnet1RouteTable21B3CEAE"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"FargateClusterVpc377E8024"}}}},"Acl":{"id":"Acl","path":"aws-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"FargateClusterVpc377E8024"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":"FargateClusterVpcPrivateSubnet2RouteTable7B7F9678"},"subnetId":{"Ref":"FargateClusterVpcPrivateSubnet2Subnet307CEE57"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":"FargateClusterVpcPublicSubnet2NATGatewayFFEC8ED2"},"routeTableId":{"Ref":"FargateClusterVpcPrivateSubnet2RouteTable7B7F9678"}}}}}},"IGW":{"id":"IGW","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/Vpc"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":"FargateClusterVpcIGW827638CB"},"vpcId":{"Ref":"FargateClusterVpc377E8024"}}}}}},"DefaultAutoScalingGroup":{"id":"DefaultAutoScalingGroup","path":"aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_autoscaling.AutoScalingGroup","version":"0.0.0","metadata":[{"vpc":"*","machineImage":"*","updateType":"Replace","instanceType":"*","vpcSubnets":{"subnetType":"Public"}},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":true}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/InstanceSecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup"}],"vpcId":{"Ref":"FargateClusterVpc377E8024"}}}}}},"InstanceRole":{"id":"InstanceRole","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/InstanceRole/ImportInstanceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/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":["FargateCluster7CCD5F93","Arn"]}},{"Action":["ecs:Poll","ecs:StartTelemetrySession"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["FargateCluster7CCD5F93","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecr:GetAuthorizationToken","ecs:DiscoverPollEndpoint","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"FargateClusterDefaultAutoScalingGroupInstanceRoleDefaultPolicy3BD78F3E","roles":[{"Ref":"FargateClusterDefaultAutoScalingGroupInstanceRole0C1F7FF7"}]}}}}}}},"InstanceProfile":{"id":"InstanceProfile","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":"FargateClusterDefaultAutoScalingGroupInstanceRole0C1F7FF7"}]}}},"ImportedInstanceProfile":{"id":"ImportedInstanceProfile","path":"aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/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":["FargateClusterDefaultAutoScalingGroupInstanceProfile2C0FEF3B","Arn"]}},"imageId":{"Ref":"SsmParameterValueawsserviceecsoptimizedamiamazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.micro","monitoring":{"enabled":false},"securityGroupIds":[{"Fn::GetAtt":["FargateClusterDefaultAutoScalingGroupInstanceSecurityGroup42AF8A40","GroupId"]}],"tagSpecifications":[{"resourceType":"instance","tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LaunchTemplate"}]},{"resourceType":"volume","tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}],"userData":{"Fn::Base64":{"Fn::Join":["",["#!/bin/bash\necho ECS_CLUSTER=",{"Ref":"FargateCluster7CCD5F93"}," >> /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-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LaunchTemplate"}]}]}}}}},"ASG":{"id":"ASG","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":"FargateClusterDefaultAutoScalingGroupLaunchTemplate7BE88B5A"},"version":{"Fn::GetAtt":["FargateClusterDefaultAutoScalingGroupLaunchTemplate7BE88B5A","LatestVersionNumber"]}},"maxSize":"1","minSize":"1","tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup","propagateAtLaunch":true}],"vpcZoneIdentifier":[{"Ref":"FargateClusterVpcPublicSubnet1SubnetB9C24BC7"},{"Ref":"FargateClusterVpcPublicSubnet2Subnet24C0F9D8"}]}}},"DrainECSHook":{"id":"DrainECSHook","path":"aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/DrainECSHook","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Function":{"id":"Function","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/DrainECSHook/Function/ServiceRole/ImportServiceRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/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":"FargateClusterDefaultAutoScalingGroupASG36A4948F"}]]}},{"Action":["ecs:DescribeContainerInstances","ecs:DescribeTasks","ecs:ListTasks","ecs:UpdateContainerInstancesState"],"Condition":{"ArnEquals":{"ecs:cluster":{"Fn::GetAtt":["FargateCluster7CCD5F93","Arn"]}}},"Effect":"Allow","Resource":"*"},{"Action":["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],"Effect":"Allow","Resource":{"Fn::GetAtt":["FargateCluster7CCD5F93","Arn"]}}],"Version":"2012-10-17"},"policyName":"FargateClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRoleDefaultPolicyB91C5343","roles":[{"Ref":"FargateClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole7FEDCD32"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":"FargateCluster7CCD5F93"}}},"handler":"index.lambda_handler","role":{"Fn::GetAtt":["FargateClusterDefaultAutoScalingGroupDrainECSHookFunctionServiceRole7FEDCD32","Arn"]},"runtime":"python3.13","tags":[{"key":"Name","value":"aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup"}],"timeout":310}}},"AllowInvoke:awssfntasksecstaskFargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic9B632D13":{"id":"AllowInvoke:awssfntasksecstaskFargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic9B632D13","path":"aws-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/DrainECSHook/Function/AllowInvoke:awssfntasksecstaskFargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic9B632D13","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":["FargateClusterDefaultAutoScalingGroupDrainECSHookFunctionE3D5BEE8","Arn"]},"principal":"sns.amazonaws.com","sourceArn":{"Ref":"FargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic49146C10"}}}},"Topic":{"id":"Topic","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/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":["FargateClusterDefaultAutoScalingGroupDrainECSHookFunctionE3D5BEE8","Arn"]},"protocol":"lambda","topicArn":{"Ref":"FargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic49146C10"}}}}}}}}}},"LifecycleHookDrainHook":{"id":"LifecycleHookDrainHook","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Topic","constructInfo":{"fqn":"aws-cdk-lib.aws_sns.Topic","version":"0.0.0","metadata":[{"masterKey":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup"}]}}}}},"Role":{"id":"Role","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup/LifecycleHookDrainHook/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/DefaultAutoScalingGroup"}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-sfn-tasks-ecs-task/FargateCluster/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-sfn-tasks-ecs-task/FargateCluster/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":"FargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic49146C10"}}],"Version":"2012-10-17"},"policyName":"FargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookRoleDefaultPolicy4958D19D","roles":[{"Ref":"FargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole410D556D"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-task/FargateCluster/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":"FargateClusterDefaultAutoScalingGroupASG36A4948F"},"defaultResult":"CONTINUE","heartbeatTimeout":300,"lifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING","notificationTargetArn":{"Ref":"FargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookTopic49146C10"},"roleArn":{"Fn::GetAtt":["FargateClusterDefaultAutoScalingGroupLifecycleHookDrainHookRole410D556D","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-sfn-tasks-ecs-task/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-sfn-tasks-ecs-task/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-sfn-tasks-ecs-task/TaskDef","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Ec2TaskDefinition","version":"0.0.0","metadata":["*","*","*","*","*"]},"children":{"TaskRole":{"id":"TaskRole","path":"aws-sfn-tasks-ecs-task/TaskDef/TaskRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}}]},"children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-sfn-tasks-ecs-task/TaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-task/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-sfn-tasks-ecs-task/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":{"Fn::Sub":"${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:d87af9b5acc567118fa529d3d3b763098200a6446a5ca64aea987729efd52534"},"memory":256,"name":"Container","logConfiguration":{"logDriver":"awslogs","options":{"awslogs-group":{"Ref":"TaskDefContainerLogGroupB60E6F44"},"awslogs-stream-prefix":"EventDemo","awslogs-region":{"Ref":"AWS::Region"}}}}],"executionRoleArn":{"Fn::GetAtt":["TaskDefExecutionRoleB4775C97","Arn"]},"family":"awssfntasksecstaskTaskDefE541322D","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}}},"Container":{"id":"Container","path":"aws-sfn-tasks-ecs-task/TaskDef/Container","constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.ContainerDefinition","version":"0.0.0"},"children":{"AssetImage":{"id":"AssetImage","path":"aws-sfn-tasks-ecs-task/TaskDef/Container/AssetImage","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr_assets.DockerImageAsset","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-sfn-tasks-ecs-task/TaskDef/Container/AssetImage/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Repository":{"id":"Repository","path":"aws-sfn-tasks-ecs-task/TaskDef/Container/AssetImage/Repository","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr.RepositoryBase","version":"0.0.0","metadata":[]}}}},"LogGroup":{"id":"LogGroup","path":"aws-sfn-tasks-ecs-task/TaskDef/Container/LogGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.LogGroup","version":"0.0.0","metadata":[{"retention":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-task/TaskDef/Container/LogGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_logs.CfnLogGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::Logs::LogGroup","aws:cdk:cloudformation:props":{}}}}}}},"ExecutionRole":{"id":"ExecutionRole","path":"aws-sfn-tasks-ecs-task/TaskDef/ExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-sfn-tasks-ecs-task/TaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-task/TaskDef/ExecutionRole/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"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-sfn-tasks-ecs-task/TaskDef/ExecutionRole/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-sfn-tasks-ecs-task/TaskDef/ExecutionRole/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":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Fn::Sub":"cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"}]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"},{"Action":["logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":{"Fn::GetAtt":["TaskDefContainerLogGroupB60E6F44","Arn"]}}],"Version":"2012-10-17"},"policyName":"TaskDefExecutionRoleDefaultPolicy0DBB737A","roles":[{"Ref":"TaskDefExecutionRoleB4775C97"}]}}}}}}}}},"Start":{"id":"Start","path":"aws-sfn-tasks-ecs-task/Start","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.Pass","version":"0.0.0"}},"Run":{"id":"Run","path":"aws-sfn-tasks-ecs-task/Run","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.Task","version":"0.0.0"}},"StateMachine":{"id":"StateMachine","path":"aws-sfn-tasks-ecs-task/StateMachine","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.StateMachine","version":"0.0.0","metadata":[{"definition":{"id":"*","startState":"*","endStates":"*"}},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]},"children":{"Role":{"id":"Role","path":"aws-sfn-tasks-ecs-task/StateMachine/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportRole":{"id":"ImportRole","path":"aws-sfn-tasks-ecs-task/StateMachine/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-task/StateMachine/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":"states.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-sfn-tasks-ecs-task/StateMachine/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-task/StateMachine/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":"ecs:RunTask","Effect":"Allow","Resource":{"Ref":"TaskDef54694570"}},{"Action":["ecs:DescribeTasks","ecs:StopTask"],"Effect":"Allow","Resource":"*"},{"Action":"iam:PassRole","Effect":"Allow","Resource":[{"Fn::GetAtt":["TaskDefExecutionRoleB4775C97","Arn"]},{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}]},{"Action":["events:DescribeRule","events:PutRule","events:PutTargets"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":events:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":rule/StepFunctionsGetEventsForECSTaskRule"]]}}],"Version":"2012-10-17"},"policyName":"StateMachineRoleDefaultPolicyDF1E6607","roles":[{"Ref":"StateMachineRoleB840431D"}]}}}}}}},"Resource":{"id":"Resource","path":"aws-sfn-tasks-ecs-task/StateMachine/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_stepfunctions.CfnStateMachine","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::StepFunctions::StateMachine","aws:cdk:cloudformation:props":{"definitionString":{"Fn::Join":["",["{\"StartAt\":\"Start\",\"States\":{\"Start\":{\"Type\":\"Pass\",\"Result\":{\"SomeKey\":\"SomeValue\"},\"Next\":\"Run\"},\"Run\":{\"End\":true,\"Parameters\":{\"Cluster\":\"",{"Fn::GetAtt":["FargateCluster7CCD5F93","Arn"]},"\",\"TaskDefinition\":\"",{"Ref":"TaskDef54694570"},"\",\"Overrides\":{\"ContainerOverrides\":[{\"Name\":\"Container\",\"Environment\":[{\"Name\":\"SOME_KEY\",\"Value.$\":\"$.SomeKey\"}]}]},\"LaunchType\":\"EC2\"},\"Type\":\"Task\",\"Resource\":\"arn:",{"Ref":"AWS::Partition"},":states:::ecs:runTask.sync\"}}}"]]},"roleArn":{"Fn::GetAtt":["StateMachineRoleB840431D","Arn"]}}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-sfn-tasks-ecs-task/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-sfn-tasks-ecs-task/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"SfnTasksEcsEc2TaskTest":{"id":"SfnTasksEcsEc2TaskTest","path":"SfnTasksEcsEc2TaskTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"SfnTasksEcsEc2TaskTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"SfnTasksEcsEc2TaskTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"SfnTasksEcsEc2TaskTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"SfnTasksEcsEc2TaskTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"SfnTasksEcsEc2TaskTest/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/custom-resource-handlers/lib/aws-ecs/lambda-source/index.py b/packages/@aws-cdk/custom-resource-handlers/lib/aws-ecs/lambda-source/index.py
index 73502aca37ac2..953d515baf328 100644
--- a/packages/@aws-cdk/custom-resource-handlers/lib/aws-ecs/lambda-source/index.py
+++ b/packages/@aws-cdk/custom-resource-handlers/lib/aws-ecs/lambda-source/index.py
@@ -11,7 +11,7 @@ def lambda_handler(event, context):
lifecycle_event = json.loads(event['Records'][0]['Sns']['Message'])
instance_id = lifecycle_event.get('EC2InstanceId')
if not instance_id:
- print('Got event without EC2InstanceId: %s', json.dumps(dict(event, ResponseURL='...')))
+ print(f"Got event without EC2InstanceId: { json.dumps(dict(event, ResponseURL='...')) }")
return
instance_arn = container_instance_arn(cluster, instance_id)
diff --git a/packages/aws-cdk-lib/aws-ecs/lib/drain-hook/instance-drain-hook.ts b/packages/aws-cdk-lib/aws-ecs/lib/drain-hook/instance-drain-hook.ts
index c3c67522c8f35..bc4dfd4cbfb33 100644
--- a/packages/aws-cdk-lib/aws-ecs/lib/drain-hook/instance-drain-hook.ts
+++ b/packages/aws-cdk-lib/aws-ecs/lib/drain-hook/instance-drain-hook.ts
@@ -62,7 +62,7 @@ export class InstanceDrainHook extends Construct {
const fn = new lambda.Function(this, 'Function', {
code: lambda.Code.fromInline(fs.readFileSync(path.join(__dirname, '..', '..', '..', 'custom-resource-handlers', 'dist', 'aws-ecs', 'lambda-source', 'index.py'), { encoding: 'utf-8' })),
handler: 'index.lambda_handler',
- runtime: lambda.Runtime.PYTHON_3_9,
+ runtime: lambda.Runtime.PYTHON_3_13,
// Timeout: some extra margin for additional API calls made by the Lambda,
// up to a maximum of 15 minutes.
timeout: cdk.Duration.seconds(Math.min(drainTime.toSeconds() + 10, 900)),
diff --git a/packages/aws-cdk-lib/aws-ecs/test/cluster.test.ts b/packages/aws-cdk-lib/aws-ecs/test/cluster.test.ts
index ceaad7dfd62e5..ebff9ccd65c33 100644
--- a/packages/aws-cdk-lib/aws-ecs/test/cluster.test.ts
+++ b/packages/aws-cdk-lib/aws-ecs/test/cluster.test.ts
@@ -434,6 +434,7 @@ describe('cluster', () => {
},
},
Handler: 'index.lambda_handler',
+ Runtime: 'python3.13',
});
Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', {
@@ -604,6 +605,7 @@ describe('cluster', () => {
},
},
Handler: 'index.lambda_handler',
+ Runtime: 'python3.13',
});
Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', {