From 0ee83443926c32db94f4cc9e6fb8644839c866f7 Mon Sep 17 00:00:00 2001
From: Felix <23635466+its-felix@users.noreply.github.com>
Date: Thu, 5 Jun 2025 18:26:40 +0200
Subject: [PATCH 1/4] chore(ecs): update instance-drain-hook lambda runtime to
python 3.13
---
.../aws-ecs-integ-alb-idle-timeout.template.json | 6 +++---
.../aws-ecs-integ-multiple-alb.template.json | 6 +++---
.../aws-ecs-integ-ecs.template.json | 6 +++---
...tls-network-load-balanced-ecs-service.template.json | 6 +++---
.../aws-ecs-integ-appmesh-proxy.template.json | 6 +++---
.../integ.app-mesh-proxy-config.js.snapshot/tree.json | 6 +++---
...s-integ-availability-zone-rebalancing.template.json | 6 +++---
.../tree.json | 6 +++---
.../aws-ecs-integ-bottlerocket.template.json | 6 +++---
.../test/ec2/integ.bottlerocket.js.snapshot/tree.json | 6 +++---
.../integ-ec2-capacity-provider.template.json | 6 +++---
.../ec2/integ.capacity-provider.js.snapshot/tree.json | 6 +++---
.../aws-ecs-integ.template.json | 6 +++---
.../test/ec2/integ.clb-host-nw.js.snapshot/tree.json | 6 +++---
.../aws-ecs-integ.template.json | 6 +++---
.../tree.json | 6 +++---
.../integ-default-capacity-provider.template.json | 6 +++---
.../tree.json | 6 +++---
.../integ-deployment-alarms.template.json | 6 +++---
.../ec2/integ.deployment-alarms.js.snapshot/tree.json | 2 +-
.../aws-ecs-integ-enable-execute-command.template.json | 6 +++---
.../integ.enable-execute-command.js.snapshot/tree.json | 2 +-
.../aws-ecs-integ.template.json | 6 +++---
.../ec2/integ.environment-file.js.snapshot/tree.json | 2 +-
.../aws-ecs-integ-exec-command.template.json | 6 +++---
.../test/ec2/integ.exec-command.js.snapshot/tree.json | 6 +++---
.../aws-ecs-integ.template.json | 6 +++---
.../ec2/integ.firelens-s3-config.js.snapshot/tree.json | 6 +++---
.../aws-ecs-integ.template.json | 6 +++---
.../integ.graviton-bottlerocket.js.snapshot/tree.json | 6 +++---
.../aws-ecs-integ.template.json | 6 +++---
.../test/ec2/integ.graviton.js.snapshot/tree.json | 6 +++---
.../aws-ecs-integ.template.json | 6 +++---
.../test/ec2/integ.lb-awsvpc-nw.js.snapshot/tree.json | 6 +++---
.../aws-ecs-integ-ecs.template.json | 6 +++---
.../test/ec2/integ.lb-bridge-nw.js.snapshot/tree.json | 6 +++---
...with-empty-placement-constraint-stack.template.json | 6 +++---
.../tree.json | 6 +++---
.../aws-cdk-ecs-integration-test-stack.template.json | 6 +++---
.../integ.placement-strategies.js.snapshot/tree.json | 6 +++---
.../aws-ecs-integ-pseudo-terminal.template.json | 6 +++---
.../ec2/integ.pseudo-terminal.js.snapshot/tree.json | 6 +++---
.../aws-ecs-integ-ecs.template.json | 6 +++---
.../test/ec2/integ.sd-awsvpc-nw.js.snapshot/tree.json | 6 +++---
.../aws-ecs-integ-ecs.template.json | 6 +++---
.../test/ec2/integ.sd-bridge-nw.js.snapshot/tree.json | 6 +++---
.../aws-ecs-integ-spot.template.json | 10 +++++-----
.../test/ec2/integ.spot-drain.js.snapshot/tree.json | 10 +++++-----
.../aws-ecs-integ.template.json | 6 +++---
.../ec2/integ.swap-parameters.js.snapshot/tree.json | 6 +++---
.../aws-cdk-ecs-integration-test-stack.template.json | 6 +++---
.../tree.json | 2 +-
.../integ-ecs-neuron-ami.template.json | 6 +++---
.../tree.json | 6 +++---
...aws-ecs-integ-bottlerocket-nvidia-ami.template.json | 6 +++---
.../tree.json | 6 +++---
.../integ-ecs-imported-cluster.template.json | 6 +++---
.../test/integ.cluster-imported.js.snapshot/tree.json | 6 +++---
.../integ-ecs-windows-server-ami.template.json | 6 +++---
.../tree.json | 2 +-
.../integ-ecs-al2023-ami.template.json | 6 +++---
.../tree.json | 6 +++---
.../cdk-ecs-fluentd.template.json | 6 +++---
.../integ.fluentd-driver.js.snapshot/tree.json | 2 +-
.../aws-ecs-integ-ecs.template.json | 6 +++---
.../aws-cdk-ecs-run-task-ec2-schedule.template.json | 6 +++---
...asks-ecs-run-task-ref-task-definition.template.json | 6 +++---
.../aws-sfn-tasks-ecs-run-task.template.json | 6 +++---
.../aws-sfn-tasks-ecs-task.template.json | 6 +++---
.../lib/aws-ecs/lambda-source/index.py | 2 +-
.../aws-ecs/lib/drain-hook/instance-drain-hook.ts | 2 +-
packages/aws-cdk-lib/aws-ecs/test/cluster.test.ts | 2 ++
72 files changed, 203 insertions(+), 201 deletions(-)
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..19f6e15e51e30 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('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": {
@@ -770,7 +770,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1595,4 +1595,4 @@
]
}
}
-}
\ 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/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..2735dd0937070 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('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": {
@@ -792,7 +792,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1269,4 +1269,4 @@
]
}
}
-}
\ 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.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..907870e6b3132 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('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": {
@@ -591,7 +591,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1234,4 +1234,4 @@
]
}
}
-}
\ 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/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 c0264f1cb40a1..596c0516e5dbc 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
@@ -880,7 +880,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('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": {
@@ -896,7 +896,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1412,4 +1412,4 @@
]
}
}
-}
\ 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.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..23b9c94ad8b04 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('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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1088,4 +1088,4 @@
]
}
}
-}
\ 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..541dc9ce88f33 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
@@ -1450,7 +1450,7 @@
"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"
+ "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": {
@@ -1466,7 +1466,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2188,4 +2188,4 @@
"version": "0.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/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..18057f1b908d8 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('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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -999,4 +999,4 @@
]
}
}
-}
\ 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..4cec68f64fc24 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
@@ -1450,7 +1450,7 @@
"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"
+ "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": {
@@ -1466,7 +1466,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2109,4 +2109,4 @@
"version": "0.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/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..08218c0e499ec 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('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": {
@@ -761,7 +761,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -926,4 +926,4 @@
]
}
}
-}
\ 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..3bf3e96a68c01 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
@@ -1438,7 +1438,7 @@
"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"
+ "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": {
@@ -1454,7 +1454,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -1897,4 +1897,4 @@
"version": "0.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.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..76357d478437e 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('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": {
@@ -825,7 +825,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1033,4 +1033,4 @@
]
}
}
-}
\ 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..82b64acfce66d 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
@@ -1603,7 +1603,7 @@
"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"
+ "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": {
@@ -1619,7 +1619,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2125,4 +2125,4 @@
"version": "0.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/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..3516b59e7f34b 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('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": {
@@ -792,7 +792,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1117,4 +1117,4 @@
]
}
}
-}
\ 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..2941225dbeb94 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
@@ -1487,7 +1487,7 @@
"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"
+ "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": {
@@ -1503,7 +1503,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2291,4 +2291,4 @@
"version": "0.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/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..3ca1704ac524b 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('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": {
@@ -571,7 +571,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -880,4 +880,4 @@
]
}
}
-}
\ 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..d75d71450cc2b 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
@@ -1095,7 +1095,7 @@
"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"
+ "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": {
@@ -1111,7 +1111,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -1868,4 +1868,4 @@
"version": "0.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.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..5fe9ebb7f41fb 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('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": {
@@ -806,7 +806,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1037,4 +1037,4 @@
]
}
}
-}
\ 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..5c4d968b051ab 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
@@ -1543,7 +1543,7 @@
"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"
+ "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": {
@@ -1559,7 +1559,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2198,4 +2198,4 @@
"version": "0.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.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 8b2410f0c120b..5e4c734727a29 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
@@ -921,7 +921,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('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": {
@@ -937,7 +937,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1323,4 +1323,4 @@
]
}
}
-}
\ 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 8aab72547d914..d393a9d05cb27 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":"","children":{"integ-deployment-alarms":{"id":"integ-deployment-alarms","path":"integ-deployment-alarms","children":{"Vpc":{"id":"Vpc","path":"integ-deployment-alarms/Vpc","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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-deployment-alarms/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPC","version":"0.0.0"}},"PublicSubnet1":{"id":"PublicSubnet1","path":"integ-deployment-alarms/Vpc/PublicSubnet1","children":{"Subnet":{"id":"Subnet","path":"integ-deployment-alarms/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-deployment-alarms/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"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","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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-deployment-alarms/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-deployment-alarms/Vpc/PublicSubnet1/EIP","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::EIP","aws:cdk:cloudformation:props":{"domain":"vpc","tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PublicSubnet1"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"}},"NATGateway":{"id":"NATGateway","path":"integ-deployment-alarms/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-deployment-alarms/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-deployment-alarms/Vpc/PublicSubnet2","children":{"Subnet":{"id":"Subnet","path":"integ-deployment-alarms/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-deployment-alarms/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"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","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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-deployment-alarms/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-deployment-alarms/Vpc/PublicSubnet2/EIP","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::EIP","aws:cdk:cloudformation:props":{"domain":"vpc","tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PublicSubnet2"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"}},"NATGateway":{"id":"NATGateway","path":"integ-deployment-alarms/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-deployment-alarms/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-deployment-alarms/Vpc/PrivateSubnet1","children":{"Subnet":{"id":"Subnet","path":"integ-deployment-alarms/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-deployment-alarms/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"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","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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-deployment-alarms/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-deployment-alarms/Vpc/PrivateSubnet2","children":{"Subnet":{"id":"Subnet","path":"integ-deployment-alarms/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-deployment-alarms/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"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","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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-deployment-alarms/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-deployment-alarms/Vpc/IGW","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::InternetGateway","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnInternetGateway","version":"0.0.0"}},"VPCGW":{"id":"VPCGW","path":"integ-deployment-alarms/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"}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"integ-deployment-alarms/Vpc/RestrictDefaultSecurityGroupCustomResource","children":{"Default":{"id":"Default","path":"integ-deployment-alarms/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"integ-deployment-alarms/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","version":"0.0.0"}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"integ-deployment-alarms/Custom::VpcRestrictDefaultSGCustomResourceProvider","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"}},"TaskDef":{"id":"TaskDef","path":"integ-deployment-alarms/TaskDef","children":{"TaskRole":{"id":"TaskRole","path":"integ-deployment-alarms/TaskDef/TaskRole","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","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-deployment-alarms/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","portMappings":[{"containerPort":80,"hostPort":8080,"protocol":"tcp"}]}],"family":"integdeploymentalarmsTaskDef16B2942D","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-deployment-alarms/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-deployment-alarms/ASG","children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"integ-deployment-alarms/ASG/InstanceSecurityGroup","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/InstanceSecurityGroup/Resource","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"}}},"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-deployment-alarms/ASG/InstanceRole","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-deployment-alarms/ASG/InstanceRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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-deployment-alarms/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-deployment-alarms/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"integ-deployment-alarms/ASG/LaunchTemplate","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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-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"}]}]}},"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-deployment-alarms/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-deployment-alarms/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-deployment-alarms/ASG/DrainECSHook","children":{"Function":{"id":"Function","path":"integ-deployment-alarms/ASG/DrainECSHook/Function","children":{"ServiceRole":{"id":"ServiceRole","path":"integ-deployment-alarms/ASG/DrainECSHook/Function/ServiceRole","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-deployment-alarms/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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-deployment-alarms/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-deployment-alarms/ASG"}],"timeout":310}},"constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"0.0.0"}},"AllowInvoke:integdeploymentalarmsASGLifecycleHookDrainHookTopic48A952B0":{"id":"AllowInvoke:integdeploymentalarmsASGLifecycleHookDrainHookTopic48A952B0","path":"integ-deployment-alarms/ASG/DrainECSHook/Function/AllowInvoke:integdeploymentalarmsASGLifecycleHookDrainHookTopic48A952B0","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-deployment-alarms/ASG/DrainECSHook/Function/Topic","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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-deployment-alarms/ASG/LifecycleHookDrainHook","children":{"Topic":{"id":"Topic","path":"integ-deployment-alarms/ASG/LifecycleHookDrainHook/Topic","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/LifecycleHookDrainHook/Topic/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Topic","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-deployment-alarms/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-deployment-alarms/ASG/LifecycleHookDrainHook/Role","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-deployment-alarms/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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-deployment-alarms/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-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","children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-deployment-alarms/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"}},"EC2CPCluster":{"id":"EC2CPCluster","path":"integ-deployment-alarms/EC2CPCluster","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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-deployment-alarms/EC2CPCluster/EC2CPCluster","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"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":"*"},{"addAsgCapacityProvider":["*"]}]}},"EC2Service":{"id":"EC2Service","path":"integ-deployment-alarms/EC2Service","children":{"Service":{"id":"Service","path":"integ-deployment-alarms/EC2Service/Service","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"}}},"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":["*","*"]}},"MyMetricAlarm":{"id":"MyMetricAlarm","path":"integ-deployment-alarms/MyMetricAlarm","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/MyMetricAlarm/Resource","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"}},"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":[{"alarmName":"*","metric":{"warnings":"*"},"evaluationPeriods":"*","threshold":"*","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"}},"DeploymentAlarms":{"id":"DeploymentAlarms","path":"DeploymentAlarms","children":{"DefaultTest":{"id":"DefaultTest","path":"DeploymentAlarms/DefaultTest","children":{"Default":{"id":"Default","path":"DeploymentAlarms/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"DeploymentAlarms/DefaultTest/DeployAssert","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"}}},"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":"","children":{"integ-deployment-alarms":{"id":"integ-deployment-alarms","path":"integ-deployment-alarms","children":{"Vpc":{"id":"Vpc","path":"integ-deployment-alarms/Vpc","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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-deployment-alarms/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPC","version":"0.0.0"}},"PublicSubnet1":{"id":"PublicSubnet1","path":"integ-deployment-alarms/Vpc/PublicSubnet1","children":{"Subnet":{"id":"Subnet","path":"integ-deployment-alarms/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-deployment-alarms/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"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","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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-deployment-alarms/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-deployment-alarms/Vpc/PublicSubnet1/EIP","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::EIP","aws:cdk:cloudformation:props":{"domain":"vpc","tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PublicSubnet1"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"}},"NATGateway":{"id":"NATGateway","path":"integ-deployment-alarms/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-deployment-alarms/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-deployment-alarms/Vpc/PublicSubnet2","children":{"Subnet":{"id":"Subnet","path":"integ-deployment-alarms/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-deployment-alarms/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"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","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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-deployment-alarms/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-deployment-alarms/Vpc/PublicSubnet2/EIP","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::EIP","aws:cdk:cloudformation:props":{"domain":"vpc","tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PublicSubnet2"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"}},"NATGateway":{"id":"NATGateway","path":"integ-deployment-alarms/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-deployment-alarms/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-deployment-alarms/Vpc/PrivateSubnet1","children":{"Subnet":{"id":"Subnet","path":"integ-deployment-alarms/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-deployment-alarms/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"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","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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-deployment-alarms/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-deployment-alarms/Vpc/PrivateSubnet2","children":{"Subnet":{"id":"Subnet","path":"integ-deployment-alarms/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-deployment-alarms/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"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","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-deployment-alarms/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-deployment-alarms/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-deployment-alarms/Vpc/IGW","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::InternetGateway","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-deployment-alarms/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnInternetGateway","version":"0.0.0"}},"VPCGW":{"id":"VPCGW","path":"integ-deployment-alarms/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"}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"integ-deployment-alarms/Vpc/RestrictDefaultSecurityGroupCustomResource","children":{"Default":{"id":"Default","path":"integ-deployment-alarms/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"integ-deployment-alarms/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","version":"0.0.0"}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"integ-deployment-alarms/Custom::VpcRestrictDefaultSGCustomResourceProvider","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"}},"TaskDef":{"id":"TaskDef","path":"integ-deployment-alarms/TaskDef","children":{"TaskRole":{"id":"TaskRole","path":"integ-deployment-alarms/TaskDef/TaskRole","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","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-deployment-alarms/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","portMappings":[{"containerPort":80,"hostPort":8080,"protocol":"tcp"}]}],"family":"integdeploymentalarmsTaskDef16B2942D","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-deployment-alarms/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-deployment-alarms/ASG","children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"integ-deployment-alarms/ASG/InstanceSecurityGroup","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/InstanceSecurityGroup/Resource","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"}}},"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-deployment-alarms/ASG/InstanceRole","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-deployment-alarms/ASG/InstanceRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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-deployment-alarms/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-deployment-alarms/ASG/ImportedInstanceProfile","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"LaunchTemplate":{"id":"LaunchTemplate","path":"integ-deployment-alarms/ASG/LaunchTemplate","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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-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"}]}]}},"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-deployment-alarms/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-deployment-alarms/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-deployment-alarms/ASG/DrainECSHook","children":{"Function":{"id":"Function","path":"integ-deployment-alarms/ASG/DrainECSHook/Function","children":{"ServiceRole":{"id":"ServiceRole","path":"integ-deployment-alarms/ASG/DrainECSHook/Function/ServiceRole","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-deployment-alarms/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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-deployment-alarms/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.13","tags":[{"key":"Name","value":"integ-deployment-alarms/ASG"}],"timeout":310}},"constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"0.0.0"}},"AllowInvoke:integdeploymentalarmsASGLifecycleHookDrainHookTopic48A952B0":{"id":"AllowInvoke:integdeploymentalarmsASGLifecycleHookDrainHookTopic48A952B0","path":"integ-deployment-alarms/ASG/DrainECSHook/Function/AllowInvoke:integdeploymentalarmsASGLifecycleHookDrainHookTopic48A952B0","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-deployment-alarms/ASG/DrainECSHook/Function/Topic","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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-deployment-alarms/ASG/LifecycleHookDrainHook","children":{"Topic":{"id":"Topic","path":"integ-deployment-alarms/ASG/LifecycleHookDrainHook/Topic","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/ASG/LifecycleHookDrainHook/Topic/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Topic","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-deployment-alarms/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-deployment-alarms/ASG/LifecycleHookDrainHook/Role","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-deployment-alarms/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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-deployment-alarms/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-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","children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-deployment-alarms/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"}},"EC2CPCluster":{"id":"EC2CPCluster","path":"integ-deployment-alarms/EC2CPCluster","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/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-deployment-alarms/EC2CPCluster/EC2CPCluster","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"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":"*"},{"addAsgCapacityProvider":["*"]}]}},"EC2Service":{"id":"EC2Service","path":"integ-deployment-alarms/EC2Service","children":{"Service":{"id":"Service","path":"integ-deployment-alarms/EC2Service/Service","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"}}},"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":["*","*"]}},"MyMetricAlarm":{"id":"MyMetricAlarm","path":"integ-deployment-alarms/MyMetricAlarm","children":{"Resource":{"id":"Resource","path":"integ-deployment-alarms/MyMetricAlarm/Resource","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"}},"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":[{"alarmName":"*","metric":{"warnings":"*"},"evaluationPeriods":"*","threshold":"*","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"}},"DeploymentAlarms":{"id":"DeploymentAlarms","path":"DeploymentAlarms","children":{"DefaultTest":{"id":"DefaultTest","path":"DeploymentAlarms/DefaultTest","children":{"Default":{"id":"Default","path":"DeploymentAlarms/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"DeploymentAlarms/DefaultTest/DeployAssert","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"}}},"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"}}}
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 c0816fa58809b..44b44ddc873a4 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
@@ -992,7 +992,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('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": {
@@ -1008,7 +1008,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1373,4 +1373,4 @@
]
}
}
-}
\ 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 ac56afc48d261..94ee0e7a53e8e 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":"","children":{"aws-ecs-integ-enable-execute-command":{"id":"aws-ecs-integ-enable-execute-command","path":"aws-ecs-integ-enable-execute-command","children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-enable-execute-command/Vpc","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-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-enable-execute-command/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPC","version":"0.0.0"}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-enable-execute-command/Vpc/PublicSubnet1","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-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","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-enable-execute-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-enable-execute-command/Vpc/PublicSubnet1"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-enable-execute-command/Vpc/PublicSubnet2","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-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","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-enable-execute-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-enable-execute-command/Vpc/PublicSubnet2"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-enable-execute-command/Vpc/PrivateSubnet1","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-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","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-enable-execute-command/Vpc/PrivateSubnet2","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-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","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-enable-execute-command/Vpc/IGW","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::InternetGateway","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnInternetGateway","version":"0.0.0"}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-enable-execute-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"}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"aws-ecs-integ-enable-execute-command/Vpc/RestrictDefaultSecurityGroupCustomResource","children":{"Default":{"id":"Default","path":"aws-ecs-integ-enable-execute-command/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"aws-ecs-integ-enable-execute-command/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","version":"0.0.0"}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"aws-ecs-integ-enable-execute-command/Custom::VpcRestrictDefaultSGCustomResourceProvider","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"}},"TaskDef":{"id":"TaskDef","path":"aws-ecs-integ-enable-execute-command/TaskDef","children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-enable-execute-command/TaskDef/TaskRole","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","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-enable-execute-command/TaskDef/TaskRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/TaskDef/TaskRole/DefaultPolicy/Resource","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"}]}},"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-ecs-integ-enable-execute-command/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","portMappings":[{"containerPort":80,"hostPort":8080,"protocol":"tcp"}]}],"family":"awsecsintegenableexecutecommandTaskDefE1A02A6B","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-enable-execute-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":["*","*","*","*","*","*","*"]}},"EcsExecBucket":{"id":"EcsExecBucket","path":"aws-ecs-integ-enable-execute-command/EcsExecBucket","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/EcsExecBucket/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{}},"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":["*"]}},"ASG":{"id":"ASG","path":"aws-ecs-integ-enable-execute-command/ASG","children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-ecs-integ-enable-execute-command/ASG/InstanceSecurityGroup","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/InstanceSecurityGroup/Resource","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"}}},"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-enable-execute-command/ASG/InstanceRole","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-enable-execute-command/ASG/InstanceRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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":"aws-ecs-integ-enable-execute-command/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":"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","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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":"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"}]}]}},"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-enable-execute-command/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":"aws-ecs-integ-enable-execute-command/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-enable-execute-command/ASG/DrainECSHook","children":{"Function":{"id":"Function","path":"aws-ecs-integ-enable-execute-command/ASG/DrainECSHook/Function","children":{"ServiceRole":{"id":"ServiceRole","path":"aws-ecs-integ-enable-execute-command/ASG/DrainECSHook/Function/ServiceRole","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-enable-execute-command/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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":"aws-ecs-integ-enable-execute-command/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":"aws-ecs-integ-enable-execute-command/ASG"}],"timeout":310}},"constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"0.0.0"}},"AllowInvoke:awsecsintegenableexecutecommandASGLifecycleHookDrainHookTopic82F94397":{"id":"AllowInvoke:awsecsintegenableexecutecommandASGLifecycleHookDrainHookTopic82F94397","path":"aws-ecs-integ-enable-execute-command/ASG/DrainECSHook/Function/AllowInvoke:awsecsintegenableexecutecommandASGLifecycleHookDrainHookTopic82F94397","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":"aws-ecs-integ-enable-execute-command/ASG/DrainECSHook/Function/Topic","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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":"aws-ecs-integ-enable-execute-command/ASG/LifecycleHookDrainHook","children":{"Topic":{"id":"Topic","path":"aws-ecs-integ-enable-execute-command/ASG/LifecycleHookDrainHook/Topic","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/LifecycleHookDrainHook/Topic/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Topic","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/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-enable-execute-command/ASG/LifecycleHookDrainHook/Role","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-enable-execute-command/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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":"aws-ecs-integ-enable-execute-command/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":"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","children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"aws-ecs-integ-enable-execute-command/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"},"name":"cp-aws-ecs-integ-enable-execute-commandEC2CapacityProvider4341E2A3"}},"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":"aws-ecs-integ-enable-execute-command/EC2CPCluster","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/EC2CPCluster/Resource","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"}}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCluster","version":"0.0.0"}},"EC2CPCluster":{"id":"EC2CPCluster","path":"aws-ecs-integ-enable-execute-command/EC2CPCluster/EC2CPCluster","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"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":"*","executeCommandConfiguration":{"logConfiguration":{"s3Bucket":"*","s3EncryptionEnabled":true,"s3KeyPrefix":"*"},"logging":"OVERRIDE"}},{"addAsgCapacityProvider":["*"]}]}},"EC2Service":{"id":"EC2Service","path":"aws-ecs-integ-enable-execute-command/EC2Service","children":{"Service":{"id":"Service","path":"aws-ecs-integ-enable-execute-command/EC2Service/Service","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"}}},"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-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"}}},"constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"}},"enable-execute-command-test":{"id":"enable-execute-command-test","path":"enable-execute-command-test","children":{"DefaultTest":{"id":"DefaultTest","path":"enable-execute-command-test/DefaultTest","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","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"}}},"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":"","children":{"aws-ecs-integ-enable-execute-command":{"id":"aws-ecs-integ-enable-execute-command","path":"aws-ecs-integ-enable-execute-command","children":{"Vpc":{"id":"Vpc","path":"aws-ecs-integ-enable-execute-command/Vpc","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-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-enable-execute-command/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPC","version":"0.0.0"}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-integ-enable-execute-command/Vpc/PublicSubnet1","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-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","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-enable-execute-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-enable-execute-command/Vpc/PublicSubnet1"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-enable-execute-command/Vpc/PublicSubnet2","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-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","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-enable-execute-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-enable-execute-command/Vpc/PublicSubnet2"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-enable-execute-command/Vpc/PrivateSubnet1","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-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","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-enable-execute-command/Vpc/PrivateSubnet2","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-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","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-integ-enable-execute-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-enable-execute-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-enable-execute-command/Vpc/IGW","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::InternetGateway","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnInternetGateway","version":"0.0.0"}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-integ-enable-execute-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"}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"aws-ecs-integ-enable-execute-command/Vpc/RestrictDefaultSecurityGroupCustomResource","children":{"Default":{"id":"Default","path":"aws-ecs-integ-enable-execute-command/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"aws-ecs-integ-enable-execute-command/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","version":"0.0.0"}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"aws-ecs-integ-enable-execute-command/Custom::VpcRestrictDefaultSGCustomResourceProvider","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"}},"TaskDef":{"id":"TaskDef","path":"aws-ecs-integ-enable-execute-command/TaskDef","children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-integ-enable-execute-command/TaskDef/TaskRole","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","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-enable-execute-command/TaskDef/TaskRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/TaskDef/TaskRole/DefaultPolicy/Resource","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"}]}},"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-ecs-integ-enable-execute-command/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","portMappings":[{"containerPort":80,"hostPort":8080,"protocol":"tcp"}]}],"family":"awsecsintegenableexecutecommandTaskDefE1A02A6B","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-enable-execute-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":["*","*","*","*","*","*","*"]}},"EcsExecBucket":{"id":"EcsExecBucket","path":"aws-ecs-integ-enable-execute-command/EcsExecBucket","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/EcsExecBucket/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{}},"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":["*"]}},"ASG":{"id":"ASG","path":"aws-ecs-integ-enable-execute-command/ASG","children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"aws-ecs-integ-enable-execute-command/ASG/InstanceSecurityGroup","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/InstanceSecurityGroup/Resource","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"}}},"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-enable-execute-command/ASG/InstanceRole","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-enable-execute-command/ASG/InstanceRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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":"aws-ecs-integ-enable-execute-command/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":"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","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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":"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"}]}]}},"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-enable-execute-command/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":"aws-ecs-integ-enable-execute-command/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-enable-execute-command/ASG/DrainECSHook","children":{"Function":{"id":"Function","path":"aws-ecs-integ-enable-execute-command/ASG/DrainECSHook/Function","children":{"ServiceRole":{"id":"ServiceRole","path":"aws-ecs-integ-enable-execute-command/ASG/DrainECSHook/Function/ServiceRole","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-enable-execute-command/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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":"aws-ecs-integ-enable-execute-command/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.13","tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/ASG"}],"timeout":310}},"constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"0.0.0"}},"AllowInvoke:awsecsintegenableexecutecommandASGLifecycleHookDrainHookTopic82F94397":{"id":"AllowInvoke:awsecsintegenableexecutecommandASGLifecycleHookDrainHookTopic82F94397","path":"aws-ecs-integ-enable-execute-command/ASG/DrainECSHook/Function/AllowInvoke:awsecsintegenableexecutecommandASGLifecycleHookDrainHookTopic82F94397","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":"aws-ecs-integ-enable-execute-command/ASG/DrainECSHook/Function/Topic","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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":"aws-ecs-integ-enable-execute-command/ASG/LifecycleHookDrainHook","children":{"Topic":{"id":"Topic","path":"aws-ecs-integ-enable-execute-command/ASG/LifecycleHookDrainHook/Topic","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/ASG/LifecycleHookDrainHook/Topic/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Topic","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-integ-enable-execute-command/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-enable-execute-command/ASG/LifecycleHookDrainHook/Role","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-ecs-integ-enable-execute-command/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/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":"aws-ecs-integ-enable-execute-command/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":"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","children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"aws-ecs-integ-enable-execute-command/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"},"name":"cp-aws-ecs-integ-enable-execute-commandEC2CapacityProvider4341E2A3"}},"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":"aws-ecs-integ-enable-execute-command/EC2CPCluster","children":{"Resource":{"id":"Resource","path":"aws-ecs-integ-enable-execute-command/EC2CPCluster/Resource","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"}}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCluster","version":"0.0.0"}},"EC2CPCluster":{"id":"EC2CPCluster","path":"aws-ecs-integ-enable-execute-command/EC2CPCluster/EC2CPCluster","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::ClusterCapacityProviderAssociations","aws:cdk:cloudformation:props":{"capacityProviders":[{"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":"*","executeCommandConfiguration":{"logConfiguration":{"s3Bucket":"*","s3EncryptionEnabled":true,"s3KeyPrefix":"*"},"logging":"OVERRIDE"}},{"addAsgCapacityProvider":["*"]}]}},"EC2Service":{"id":"EC2Service","path":"aws-ecs-integ-enable-execute-command/EC2Service","children":{"Service":{"id":"Service","path":"aws-ecs-integ-enable-execute-command/EC2Service/Service","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"}}},"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-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"}}},"constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"}},"enable-execute-command-test":{"id":"enable-execute-command-test","path":"enable-execute-command-test","children":{"DefaultTest":{"id":"DefaultTest","path":"enable-execute-command-test/DefaultTest","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","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"}}},"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"}}}
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 989a28b7d9f5a..7b67dd2efa821 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
@@ -915,7 +915,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('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": {
@@ -931,7 +931,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1606,4 +1606,4 @@
]
}
}
-}
\ 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 e9fe84c39128b..c49d43cede565 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"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"aws-ecs-integ/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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":"1b2c92f2cd21c170884393633bd4c732676df6290562199b6e3ca5e2a1be7d18.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":"9a1fcb4a7ecba81ad70e9d3fb241f6794497da945dae5f25924e4dd002b65f2d.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"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"aws-ecs-integ/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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.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":"1b2c92f2cd21c170884393633bd4c732676df6290562199b6e3ca5e2a1be7d18.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":"9a1fcb4a7ecba81ad70e9d3fb241f6794497da945dae5f25924e4dd002b65f2d.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"}}}}}
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..10a8ad888abe9 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('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": {
@@ -915,7 +915,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1256,4 +1256,4 @@
]
}
}
-}
\ 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..4acfb00aea9af 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
@@ -1654,7 +1654,7 @@
"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"
+ "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": {
@@ -1670,7 +1670,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2515,4 +2515,4 @@
"version": "0.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/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..1d56985f597e4 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('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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1225,4 +1225,4 @@
]
}
}
-}
\ 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..cfc2da614123f 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
@@ -1450,7 +1450,7 @@
"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"
+ "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": {
@@ -1466,7 +1466,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2528,4 +2528,4 @@
"version": "0.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/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..84c1ec4d29ede 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('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": {
@@ -797,7 +797,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -962,4 +962,4 @@
]
}
}
-}
\ 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..a10188096067a 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
@@ -1490,7 +1490,7 @@
"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"
+ "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": {
@@ -1506,7 +1506,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -1949,4 +1949,4 @@
"version": "0.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/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..d3398e4653e89 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('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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -936,4 +936,4 @@
]
}
}
-}
\ 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..5420b161dad9c 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
@@ -1450,7 +1450,7 @@
"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"
+ "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": {
@@ -1466,7 +1466,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -1923,4 +1923,4 @@
"version": "0.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/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..701e54addeb0a 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('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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1211,4 +1211,4 @@
]
}
}
-}
\ 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..d9cddb5611709 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
@@ -1450,7 +1450,7 @@
"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"
+ "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": {
@@ -1466,7 +1466,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2423,4 +2423,4 @@
"version": "0.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/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..e9a4394b196e9 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('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": {
@@ -792,7 +792,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1157,4 +1157,4 @@
]
}
}
-}
\ 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..b9b16a3605f46 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
@@ -1487,7 +1487,7 @@
"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"
+ "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": {
@@ -1503,7 +1503,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2352,4 +2352,4 @@
"version": "0.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/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..ebf0b18462c1e 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('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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -999,4 +999,4 @@
]
}
}
-}
\ 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..95256f80848cf 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
@@ -1449,7 +1449,7 @@
"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"
+ "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": {
@@ -1465,7 +1465,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2124,4 +2124,4 @@
"version": "0.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/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..8ba1f2ec10dca 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('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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1008,4 +1008,4 @@
]
}
}
-}
\ 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..15886baf7b02c 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
@@ -1449,7 +1449,7 @@
"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"
+ "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": {
@@ -1465,7 +1465,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2078,4 +2078,4 @@
"version": "0.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/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..3c29969b1319f 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('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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1047,4 +1047,4 @@
]
}
}
-}
\ 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..7fae8e6fbbd66 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
@@ -1450,7 +1450,7 @@
"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"
+ "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": {
@@ -1466,7 +1466,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2192,4 +2192,4 @@
"version": "0.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/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..f803e9db7a682 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('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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1105,4 +1105,4 @@
]
}
}
-}
\ 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..b1279d0948389 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
@@ -1450,7 +1450,7 @@
"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"
+ "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": {
@@ -1466,7 +1466,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2253,4 +2253,4 @@
"version": "0.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/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..d100a10bc4d1c 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('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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1059,4 +1059,4 @@
]
}
}
-}
\ 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..15855a30b6322 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
@@ -1450,7 +1450,7 @@
"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"
+ "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": {
@@ -1466,7 +1466,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2187,4 +2187,4 @@
"version": "0.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/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..0642b2e79c8c4 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('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": {
@@ -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('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": {
@@ -1282,7 +1282,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1516,4 +1516,4 @@
]
}
}
-}
\ 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..de15c34282c69 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
@@ -1459,7 +1459,7 @@
"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"
+ "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": {
@@ -1475,7 +1475,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2546,7 +2546,7 @@
"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"
+ "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": {
@@ -2562,7 +2562,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -3199,4 +3199,4 @@
"version": "0.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/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..f88cdefb0af65 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('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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1043,4 +1043,4 @@
]
}
}
-}
\ 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..bafca04274e8d 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
@@ -1450,7 +1450,7 @@
"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"
+ "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": {
@@ -1466,7 +1466,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2195,4 +2195,4 @@
"version": "0.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/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 34859049181d0..929a619b6f51e 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
@@ -879,7 +879,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('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": {
@@ -895,7 +895,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1258,4 +1258,4 @@
]
}
}
-}
\ 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 6e0d5b11651b1..60fc3fab55baf 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":"","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":"Vpc8378EB38"}}},"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":"Vpc8378EB38"}}},"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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}},"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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}},"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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"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":"Vpc8378EB38"}}},"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":"Vpc8378EB38"}}},"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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}},"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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}},"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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"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":"Vpc8378EB38"}}},"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":"Vpc8378EB38"}}},"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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}},"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":"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-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":"Vpc8378EB38"}}},"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":"Vpc8378EB38"}}},"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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}},"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":"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-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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment","version":"0.0.0"}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"aws-cdk-ecs-integration-test-stack/Vpc/RestrictDefaultSecurityGroupCustomResource","children":{"Default":{"id":"Default","path":"aws-cdk-ecs-integration-test-stack/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"aws-cdk-ecs-integration-test-stack/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","version":"0.0.0"}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"aws-cdk-ecs-integration-test-stack/Custom::VpcRestrictDefaultSGCustomResourceProvider","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"}},"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":"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-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":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}},"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}]}]}},"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":"TheContainer"}],"family":"awscdkecsintegrationteststackTaskDefF811D259","networkMode":"bridge","placementConstraints":[{"type":"memberOf","expression":"attribute:ecs.instance-type =~ t2.*"}],"requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnTaskDefinition","version":"0.0.0"}},"TheContainer":{"id":"TheContainer","path":"aws-cdk-ecs-integration-test-stack/TaskDef/TheContainer","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":["*","*","*","*"]}},"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","children":{"Service":{"id":"Service","path":"aws-cdk-ecs-integration-test-stack/Ec2Service/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":"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":["*","*"]}},"TaskDefinitionPlacementConstraints":{"id":"TaskDefinitionPlacementConstraints","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints","children":{"DefaultTest":{"id":"DefaultTest","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints/DefaultTest","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","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"}}},"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-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":"","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":"Vpc8378EB38"}}},"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":"Vpc8378EB38"}}},"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":"VpcPublicSubnet1RouteTable6C95E38E"},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"}}},"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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet1RouteTable6C95E38E"}}},"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":["VpcPublicSubnet1EIPD7E02669","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet1Subnet5C2D37C4"},"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":"Vpc8378EB38"}}},"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":"Vpc8378EB38"}}},"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":"VpcPublicSubnet2RouteTable94F7E489"},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"}}},"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":"VpcIGWD7BA715C"},"routeTableId":{"Ref":"VpcPublicSubnet2RouteTable94F7E489"}}},"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":["VpcPublicSubnet2EIP3C605A87","AllocationId"]},"subnetId":{"Ref":"VpcPublicSubnet2Subnet691E08A3"},"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":"Vpc8378EB38"}}},"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":"Vpc8378EB38"}}},"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":"VpcPrivateSubnet1RouteTableB2C5B500"},"subnetId":{"Ref":"VpcPrivateSubnet1Subnet536B997A"}}},"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":"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-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":"Vpc8378EB38"}}},"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":"Vpc8378EB38"}}},"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":"VpcPrivateSubnet2RouteTableA678073B"},"subnetId":{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}}},"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":"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-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":"VpcIGWD7BA715C"},"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment","version":"0.0.0"}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"aws-cdk-ecs-integration-test-stack/Vpc/RestrictDefaultSecurityGroupCustomResource","children":{"Default":{"id":"Default","path":"aws-cdk-ecs-integration-test-stack/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"aws-cdk-ecs-integration-test-stack/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","version":"0.0.0"}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"aws-cdk-ecs-integration-test-stack/Custom::VpcRestrictDefaultSGCustomResourceProvider","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"}},"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":"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-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":"VpcPrivateSubnet1Subnet536B997A"},{"Ref":"VpcPrivateSubnet2Subnet3788AAA1"}]}},"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.13","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}]}]}},"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":"TheContainer"}],"family":"awscdkecsintegrationteststackTaskDefF811D259","networkMode":"bridge","placementConstraints":[{"type":"memberOf","expression":"attribute:ecs.instance-type =~ t2.*"}],"requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnTaskDefinition","version":"0.0.0"}},"TheContainer":{"id":"TheContainer","path":"aws-cdk-ecs-integration-test-stack/TaskDef/TheContainer","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":["*","*","*","*"]}},"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","children":{"Service":{"id":"Service","path":"aws-cdk-ecs-integration-test-stack/Ec2Service/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":"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":["*","*"]}},"TaskDefinitionPlacementConstraints":{"id":"TaskDefinitionPlacementConstraints","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints","children":{"DefaultTest":{"id":"DefaultTest","path":"aws-cdk-ecs-integration-test-stack/TaskDefinitionPlacementConstraints/DefaultTest","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","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"}}},"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-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"}}}
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..7e3a77a31d5b0 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('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": {
@@ -782,7 +782,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -962,4 +962,4 @@
]
}
}
-}
\ 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..f4ff739ed14de 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
@@ -1488,7 +1488,7 @@
"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"
+ "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": {
@@ -1504,7 +1504,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2018,4 +2018,4 @@
"version": "0.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/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..09f05d491be2d 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('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": {
@@ -797,7 +797,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -962,4 +962,4 @@
]
}
}
-}
\ 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..1c651ad828a46 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
@@ -1490,7 +1490,7 @@
"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"
+ "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": {
@@ -1506,7 +1506,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2005,4 +2005,4 @@
"version": "0.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.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..bf9d6bfed7041 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('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": {
@@ -782,7 +782,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -962,4 +962,4 @@
]
}
}
-}
\ 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..68a01baab9c41 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
@@ -1488,7 +1488,7 @@
"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"
+ "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": {
@@ -1504,7 +1504,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -2029,4 +2029,4 @@
"version": "0.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.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 6da7d9b924d56..4756046e3fe07 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
@@ -736,7 +736,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('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": {
@@ -752,7 +752,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1125,4 +1125,4 @@
]
}
}
-}
\ 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 6b68e17764fa7..22381358a3ced 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":"","children":{"integ-ecs-windows-server-ami":{"id":"integ-ecs-windows-server-ami","path":"integ-ecs-windows-server-ami","children":{"Vpc":{"id":"Vpc","path":"integ-ecs-windows-server-ami/Vpc","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-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-windows-server-ami/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPC","version":"0.0.0"}},"PublicSubnet1":{"id":"PublicSubnet1","path":"integ-ecs-windows-server-ami/Vpc/PublicSubnet1","children":{"Subnet":{"id":"Subnet","path":"integ-ecs-windows-server-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-windows-server-ami/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"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","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-windows-server-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-windows-server-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-windows-server-ami/Vpc/PublicSubnet1/EIP","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"}},"NATGateway":{"id":"NATGateway","path":"integ-ecs-windows-server-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-windows-server-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-windows-server-ami/Vpc/PrivateSubnet1","children":{"Subnet":{"id":"Subnet","path":"integ-ecs-windows-server-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-windows-server-ami/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"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","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-windows-server-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-windows-server-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-windows-server-ami/Vpc/IGW","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::InternetGateway","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnInternetGateway","version":"0.0.0"}},"VPCGW":{"id":"VPCGW","path":"integ-ecs-windows-server-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"}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"integ-ecs-windows-server-ami/Vpc/RestrictDefaultSecurityGroupCustomResource","children":{"Default":{"id":"Default","path":"integ-ecs-windows-server-ami/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"integ-ecs-windows-server-ami/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","version":"0.0.0"}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"integ-ecs-windows-server-ami/Custom::VpcRestrictDefaultSGCustomResourceProvider","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"}},"Cluster":{"id":"Cluster","path":"integ-ecs-windows-server-ami/Cluster","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-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-windows-server-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-windows-server-ami/InstanceRole","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","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-windows-server-ami/InstanceRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/ASG","children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"integ-ecs-windows-server-ami/ASG/InstanceSecurityGroup","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/InstanceSecurityGroup/Resource","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"}}},"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-windows-server-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-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","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-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":"SsmParameterValueawsserviceamiwindowslatestWindowsServer2022EnglishFullECSOptimizedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.large","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"}]}]}},"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-windows-server-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-windows-server-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-windows-server-ami/ASG/DrainECSHook","children":{"Function":{"id":"Function","path":"integ-ecs-windows-server-ami/ASG/DrainECSHook/Function","children":{"ServiceRole":{"id":"ServiceRole","path":"integ-ecs-windows-server-ami/ASG/DrainECSHook/Function/ServiceRole","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-windows-server-ami/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-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-windows-server-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-windows-server-ami/ASG"}],"timeout":310}},"constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"0.0.0"}},"AllowInvoke:integecswindowsserveramiASGLifecycleHookDrainHookTopic7F7CFC5B":{"id":"AllowInvoke:integecswindowsserveramiASGLifecycleHookDrainHookTopic7F7CFC5B","path":"integ-ecs-windows-server-ami/ASG/DrainECSHook/Function/AllowInvoke:integecswindowsserveramiASGLifecycleHookDrainHookTopic7F7CFC5B","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-windows-server-ami/ASG/DrainECSHook/Function/Topic","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-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-windows-server-ami/ASG/LifecycleHookDrainHook","children":{"Topic":{"id":"Topic","path":"integ-ecs-windows-server-ami/ASG/LifecycleHookDrainHook/Topic","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/LifecycleHookDrainHook/Topic/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Topic","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-ecs-windows-server-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-windows-server-ami/ASG/LifecycleHookDrainHook/Role","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-windows-server-ami/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-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-windows-server-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":"*","instanceType":"*","machineImage":"*","minCapacity":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]}},"SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2022-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2022-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-2022-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-2022-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2022-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-2022-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","children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-ecs-windows-server-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"}},"TaskDef":{"id":"TaskDef","path":"integ-ecs-windows-server-ami/TaskDef","children":{"TaskRole":{"id":"TaskRole","path":"integ-ecs-windows-server-ami/TaskDef/TaskRole","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","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-ecs-windows-server-ami/TaskDef/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::TaskDefinition","aws:cdk:cloudformation:props":{"containerDefinitions":[{"cpu":1024,"essential":true,"image":"public.ecr.aws/aws-observability/aws-for-fluent-bit:windowsservercore-stable","memory":2096,"name":"fluent-bit"}],"family":"integecswindowsserveramiTaskDef7E874ECF","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnTaskDefinition","version":"0.0.0"}},"fluent-bit":{"id":"fluent-bit","path":"integ-ecs-windows-server-ami/TaskDef/fluent-bit","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":"integ-ecs-windows-server-ami/EC2Service","children":{"Service":{"id":"Service","path":"integ-ecs-windows-server-ami/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":"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"}}},"constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"}},"ClusterWindowsServer":{"id":"ClusterWindowsServer","path":"ClusterWindowsServer","children":{"DefaultTest":{"id":"DefaultTest","path":"ClusterWindowsServer/DefaultTest","children":{"Default":{"id":"Default","path":"ClusterWindowsServer/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"ClusterWindowsServer/DefaultTest/DeployAssert","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"}}},"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":"","children":{"integ-ecs-windows-server-ami":{"id":"integ-ecs-windows-server-ami","path":"integ-ecs-windows-server-ami","children":{"Vpc":{"id":"Vpc","path":"integ-ecs-windows-server-ami/Vpc","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-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-windows-server-ami/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPC","version":"0.0.0"}},"PublicSubnet1":{"id":"PublicSubnet1","path":"integ-ecs-windows-server-ami/Vpc/PublicSubnet1","children":{"Subnet":{"id":"Subnet","path":"integ-ecs-windows-server-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-windows-server-ami/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"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","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-windows-server-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-windows-server-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-windows-server-ami/Vpc/PublicSubnet1/EIP","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"}},"NATGateway":{"id":"NATGateway","path":"integ-ecs-windows-server-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-windows-server-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-windows-server-ami/Vpc/PrivateSubnet1","children":{"Subnet":{"id":"Subnet","path":"integ-ecs-windows-server-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-windows-server-ami/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"Vpc8378EB38"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"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","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"integ-ecs-windows-server-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-windows-server-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-windows-server-ami/Vpc/IGW","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::InternetGateway","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnInternetGateway","version":"0.0.0"}},"VPCGW":{"id":"VPCGW","path":"integ-ecs-windows-server-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"}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"integ-ecs-windows-server-ami/Vpc/RestrictDefaultSecurityGroupCustomResource","children":{"Default":{"id":"Default","path":"integ-ecs-windows-server-ami/Vpc/RestrictDefaultSecurityGroupCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"maxAzs":"*"}]}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"integ-ecs-windows-server-ami/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","version":"0.0.0"}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"integ-ecs-windows-server-ami/Custom::VpcRestrictDefaultSGCustomResourceProvider","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"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"}},"Cluster":{"id":"Cluster","path":"integ-ecs-windows-server-ami/Cluster","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-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-windows-server-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-windows-server-ami/InstanceRole","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","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-windows-server-ami/InstanceRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/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":"integ-ecs-windows-server-ami/ASG","children":{"InstanceSecurityGroup":{"id":"InstanceSecurityGroup","path":"integ-ecs-windows-server-ami/ASG/InstanceSecurityGroup","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/InstanceSecurityGroup/Resource","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"}}},"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-windows-server-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-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","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-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":"SsmParameterValueawsserviceamiwindowslatestWindowsServer2022EnglishFullECSOptimizedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"},"instanceType":"t2.large","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"}]}]}},"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-windows-server-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-windows-server-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-windows-server-ami/ASG/DrainECSHook","children":{"Function":{"id":"Function","path":"integ-ecs-windows-server-ami/ASG/DrainECSHook/Function","children":{"ServiceRole":{"id":"ServiceRole","path":"integ-ecs-windows-server-ami/ASG/DrainECSHook/Function/ServiceRole","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-windows-server-ami/ASG/DrainECSHook/Function/ServiceRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-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-windows-server-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.13","tags":[{"key":"Name","value":"integ-ecs-windows-server-ami/ASG"}],"timeout":310}},"constructInfo":{"fqn":"aws-cdk-lib.aws_lambda.CfnFunction","version":"0.0.0"}},"AllowInvoke:integecswindowsserveramiASGLifecycleHookDrainHookTopic7F7CFC5B":{"id":"AllowInvoke:integecswindowsserveramiASGLifecycleHookDrainHookTopic7F7CFC5B","path":"integ-ecs-windows-server-ami/ASG/DrainECSHook/Function/AllowInvoke:integecswindowsserveramiASGLifecycleHookDrainHookTopic7F7CFC5B","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-windows-server-ami/ASG/DrainECSHook/Function/Topic","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-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-windows-server-ami/ASG/LifecycleHookDrainHook","children":{"Topic":{"id":"Topic","path":"integ-ecs-windows-server-ami/ASG/LifecycleHookDrainHook/Topic","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-ami/ASG/LifecycleHookDrainHook/Topic/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::SNS::Topic","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"integ-ecs-windows-server-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-windows-server-ami/ASG/LifecycleHookDrainHook/Role","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","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"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}},"DefaultPolicy":{"id":"DefaultPolicy","path":"integ-ecs-windows-server-ami/ASG/LifecycleHookDrainHook/Role/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"integ-ecs-windows-server-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-windows-server-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":"*","instanceType":"*","machineImage":"*","minCapacity":"*"},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addUserData":["*"]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]},{"addToRolePolicy":[{}]}]}},"SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2022-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter":{"id":"SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2022-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-2022-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-2022-English-Full-ECS_Optimized--image_id:C96584B6-F00A-464E-AD19-53AFF4B05118":{"id":"SsmParameterValue:--aws--service--ami-windows-latest--Windows_Server-2022-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-2022-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","children":{"EC2CapacityProvider":{"id":"EC2CapacityProvider","path":"integ-ecs-windows-server-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"}},"TaskDef":{"id":"TaskDef","path":"integ-ecs-windows-server-ami/TaskDef","children":{"TaskRole":{"id":"TaskRole","path":"integ-ecs-windows-server-ami/TaskDef/TaskRole","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","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-ecs-windows-server-ami/TaskDef/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::TaskDefinition","aws:cdk:cloudformation:props":{"containerDefinitions":[{"cpu":1024,"essential":true,"image":"public.ecr.aws/aws-observability/aws-for-fluent-bit:windowsservercore-stable","memory":2096,"name":"fluent-bit"}],"family":"integecswindowsserveramiTaskDef7E874ECF","networkMode":"bridge","requiresCompatibilities":["EC2"],"taskRoleArn":{"Fn::GetAtt":["TaskDefTaskRole1EDB4A67","Arn"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnTaskDefinition","version":"0.0.0"}},"fluent-bit":{"id":"fluent-bit","path":"integ-ecs-windows-server-ami/TaskDef/fluent-bit","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":"integ-ecs-windows-server-ami/EC2Service","children":{"Service":{"id":"Service","path":"integ-ecs-windows-server-ami/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":"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"}}},"constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"}},"ClusterWindowsServer":{"id":"ClusterWindowsServer","path":"ClusterWindowsServer","children":{"DefaultTest":{"id":"DefaultTest","path":"ClusterWindowsServer/DefaultTest","children":{"Default":{"id":"Default","path":"ClusterWindowsServer/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"ClusterWindowsServer/DefaultTest/DeployAssert","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"}}},"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"}}}
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..bd5b9ef6a79d2 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('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": {
@@ -644,7 +644,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -824,4 +824,4 @@
]
}
}
-}
\ 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..84c952df8f9f6 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
@@ -1210,7 +1210,7 @@
"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"
+ "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": {
@@ -1226,7 +1226,7 @@
"Arn"
]
},
- "runtime": "python3.9",
+ "runtime": "python3.13",
"tags": [
{
"key": "Name",
@@ -1758,4 +1758,4 @@
"version": "0.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/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..50eb33cbf7f33 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('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": {
@@ -624,7 +624,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -872,4 +872,4 @@
]
}
}
-}
\ 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..150ac0ad69845 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":"","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.13","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"}}}
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..33125a94d6321 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('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": {
@@ -591,7 +591,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1078,4 +1078,4 @@
]
}
}
-}
\ 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/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 e95c6c45aa39f..e805240c1421a 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
@@ -716,7 +716,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('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": {
@@ -732,7 +732,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1257,4 +1257,4 @@
]
}
}
-}
\ 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/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..eb73b2133057f 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('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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1293,4 +1293,4 @@
]
}
}
-}
\ 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/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..c0703e16d91ec 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('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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1330,4 +1330,4 @@
]
}
}
-}
\ 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/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..47c2193c8d694 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('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": {
@@ -771,7 +771,7 @@
"Arn"
]
},
- "Runtime": "python3.9",
+ "Runtime": "python3.13",
"Tags": [
{
"Key": "Name",
@@ -1218,4 +1218,4 @@
]
}
}
-}
\ 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..e2d99dad8a006 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('Got event without EC2InstanceId: %s' % 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', {
From 029c12508662548364dbb51d3b8a944abcfc1477 Mon Sep 17 00:00:00 2001
From: "A. Abdel-Rahman"
Date: Mon, 28 Jul 2025 10:07:20 +0200
Subject: [PATCH 2/4] refactor(ecs): use f-string in custom resource
---
.../custom-resource-handlers/lib/aws-ecs/lambda-source/index.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 e2d99dad8a006..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)
From 25498add72f041394f8042c938712bff536c84dc Mon Sep 17 00:00:00 2001
From: Abdelrahman Abdelrahman
Date: Fri, 1 Aug 2025 11:43:35 +0000
Subject: [PATCH 3/4] Merge branch 'main' into
34634-AwsEcsDrainHookLambdaRuntime with updated snapshots
---
...aws-ecs-integ-alb-idle-timeout.assets.json | 9 +-
...s-ecs-integ-alb-idle-timeout.template.json | 4 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
...efaultTestDeployAssertE5F6E3B0.assets.json | 5 +-
.../tree.json | 3342 +----------------
...efaultTestDeployAssert1194B50F.assets.json | 5 +-
.../aws-ecs-integ-multiple-alb.assets.json | 9 +-
.../aws-ecs-integ-multiple-alb.template.json | 4 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
.../tree.json | 2651 +------------
.../aws-ecs-integ-ecs.assets.json | 9 +-
.../aws-ecs-integ-ecs.template.json | 4 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
...efaultTestDeployAssertF02313CA.assets.json | 5 +-
.../tree.json | 2794 +-------------
.../manifest.json | 7 +-
...work-load-balanced-ecs-service.assets.json | 6 +-
...rk-load-balanced-ecs-service.template.json | 4 +-
.../tree.json | 2 +-
.../aws-ecs-integ-lb-fargate.assets.json | 5 +-
.../fargate/integ.nlb-sg.js.snapshot/cdk.out | 2 +-
.../integ.nlb-sg.js.snapshot/integ.json | 5 +-
...efaultTestDeployAssert3391A20B.assets.json | 5 +-
.../integ.nlb-sg.js.snapshot/manifest.json | 816 +++-
.../integ.nlb-sg.js.snapshot/tree.json | 1305 +------
...cs-patterns-queue-grace-period.assets.json | 6 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 473 ++-
...efaultTestDeployAssert2CA06C1B.assets.json | 4 +-
.../tree.json | 2 +-
...cs-patterns-queue-health-check.assets.json | 8 +-
.../cdk.out | 2 +-
...efaultTestDeployAssert29ADF26E.assets.json | 5 +-
.../integ.json | 5 +-
.../manifest.json | 969 ++++-
.../tree.json | 1618 +-------
.../Dockerfile | 11 +
.../index.py | 32 +
...ws-ecs-patterns-queue-isolated.assets.json | 8 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
...efaultTestDeployAssert0132317A.assets.json | 5 +-
.../manifest.json | 1131 +++++-
.../tree.json | 2041 +---------
.../Dockerfile | 11 +
.../index.py | 32 +
.../Dockerfile | 10 -
.../index.py | 22 -
...-patterns-queue-no-cpu-scaling.assets.json | 18 +-
...atterns-queue-no-cpu-scaling.template.json | 2 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 956 ++++-
...efaultTestDeployAssertE4E4F855.assets.json | 5 +-
.../tree.json | 1575 +-------
...-ecs-patterns-queu-no-cooldown.assets.json | 8 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 970 ++++-
...efaultTestDeployAssert73AFD2F6.assets.json | 5 +-
.../tree.json | 1611 +-------
...efaultTestDeployAssert4E6713E1.assets.json | 5 +-
.../aws-ecs-runtime-integ.assets.json | 8 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 860 ++++-
.../tree.json | 1025 +----
.../aws-fargate-integ.assets.json | 8 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 1165 +++++-
...efaultTestDeployAssertD65416D6.assets.json | 5 +-
.../tree.json | 1583 +-------
.../aws-ecs-integ-appmesh-proxy.assets.json | 9 +-
.../aws-ecs-integ-appmesh-proxy.template.json | 4 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
.../tree.json | 2192 +----------
...-availability-zone-rebalancing.assets.json | 9 +-
...vailability-zone-rebalancing.template.json | 4 +-
...efaultTestDeployAssert8F80E41A.assets.json | 5 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
.../tree.json | 2113 +----------
.../aws-ecs-integ-bottlerocket.assets.json | 9 +-
.../aws-ecs-integ-bottlerocket.template.json | 4 +-
.../integ.bottlerocket.js.snapshot/cdk.out | 2 +-
.../integ.bottlerocket.js.snapshot/integ.json | 5 +-
.../manifest.json | 521 ++-
.../integ.bottlerocket.js.snapshot/tree.json | 1901 +---------
.../cdk.out | 2 +-
.../integ-ec2-capacity-provider.assets.json | 9 +-
.../integ-ec2-capacity-provider.template.json | 4 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
.../tree.json | 2129 +----------
.../aws-ecs-integ.assets.json | 9 +-
.../aws-ecs-integ.template.json | 4 +-
.../ec2/integ.clb-host-nw.js.snapshot/cdk.out | 2 +-
.../integ.clb-host-nw.js.snapshot/integ.json | 5 +-
.../manifest.json | 521 ++-
.../integ.clb-host-nw.js.snapshot/tree.json | 2295 +----------
.../aws-ecs-integ.assets.json | 9 +-
.../aws-ecs-integ.template.json | 4 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
.../tree.json | 1872 +--------
...efaultTestDeployAssert30F9785A.assets.json | 5 +-
.../cdk.out | 2 +-
...nteg-default-capacity-provider.assets.json | 9 +-
...eg-default-capacity-provider.template.json | 4 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
.../tree.json | 2202 +----------
.../integ-deployment-alarms.assets.json | 6 +-
.../integ-deployment-alarms.template.json | 4 +-
.../manifest.json | 7 +-
.../tree.json | 2 +-
...s-integ-enable-execute-command.assets.json | 6 +-
...integ-enable-execute-command.template.json | 4 +-
.../manifest.json | 7 +-
.../tree.json | 2 +-
.../aws-ecs-integ.assets.json | 6 +-
.../aws-ecs-integ.template.json | 4 +-
.../manifest.json | 7 +-
.../tree.json | 2 +-
.../aws-ecs-integ-exec-command.assets.json | 9 +-
.../aws-ecs-integ-exec-command.template.json | 4 +-
.../integ.exec-command.js.snapshot/cdk.out | 2 +-
.../integ.exec-command.js.snapshot/integ.json | 5 +-
.../manifest.json | 521 ++-
.../integ.exec-command.js.snapshot/tree.json | 2519 +------------
.../aws-ecs-integ.assets.json | 12 +-
.../aws-ecs-integ.template.json | 4 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
.../tree.json | 2532 +------------
.../aws-ecs-integ.assets.json | 9 +-
.../aws-ecs-integ.template.json | 4 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
.../tree.json | 1953 +---------
.../aws-ecs-integ.assets.json | 9 +-
.../aws-ecs-integ.template.json | 4 +-
.../ec2/integ.graviton.js.snapshot/cdk.out | 2 +-
.../ec2/integ.graviton.js.snapshot/integ.json | 5 +-
.../integ.graviton.js.snapshot/manifest.json | 521 ++-
.../ec2/integ.graviton.js.snapshot/tree.json | 1927 +---------
.../aws-ecs-integ.assets.json | 9 +-
.../aws-ecs-integ.template.json | 4 +-
.../integ.lb-awsvpc-nw.js.snapshot/cdk.out | 2 +-
.../integ.lb-awsvpc-nw.js.snapshot/integ.json | 5 +-
.../manifest.json | 521 ++-
.../integ.lb-awsvpc-nw.js.snapshot/tree.json | 2427 +-----------
.../aws-ecs-integ-ecs.assets.json | 9 +-
.../aws-ecs-integ-ecs.template.json | 4 +-
.../integ.lb-bridge-nw.js.snapshot/cdk.out | 2 +-
.../integ.lb-bridge-nw.js.snapshot/integ.json | 5 +-
.../manifest.json | 521 ++-
.../integ.lb-bridge-nw.js.snapshot/tree.json | 2356 +-----------
...efaultTestDeployAssert4E6713E1.assets.json | 5 +-
...pty-placement-constraint-stack.assets.json | 9 +-
...y-placement-constraint-stack.template.json | 4 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
.../tree.json | 2128 +----------
...cdk-ecs-integration-test-stack.assets.json | 9 +-
...k-ecs-integration-test-stack.template.json | 4 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
.../tree.json | 2082 +---------
...efaultTestDeployAssert1B88B826.assets.json | 5 +-
.../aws-ecs-integ-pseudo-terminal.assets.json | 9 +-
...ws-ecs-integ-pseudo-terminal.template.json | 4 +-
.../integ.pseudo-terminal.js.snapshot/cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
.../tree.json | 2196 +----------
.../aws-ecs-integ-ecs.assets.json | 9 +-
.../aws-ecs-integ-ecs.template.json | 4 +-
.../integ.sd-awsvpc-nw.js.snapshot/cdk.out | 2 +-
.../integ.sd-awsvpc-nw.js.snapshot/integ.json | 5 +-
.../manifest.json | 521 ++-
.../integ.sd-awsvpc-nw.js.snapshot/tree.json | 2257 +----------
.../aws-ecs-integ-ecs.assets.json | 9 +-
.../aws-ecs-integ-ecs.template.json | 4 +-
.../integ.sd-bridge-nw.js.snapshot/cdk.out | 2 +-
.../integ.sd-bridge-nw.js.snapshot/integ.json | 5 +-
.../manifest.json | 521 ++-
.../integ.sd-bridge-nw.js.snapshot/tree.json | 2191 +----------
.../aws-ecs-integ-spot.assets.json | 9 +-
.../aws-ecs-integ-spot.template.json | 6 +-
.../ec2/integ.spot-drain.js.snapshot/cdk.out | 2 +-
.../integ.spot-drain.js.snapshot/integ.json | 5 +-
.../manifest.json | 566 ++-
.../integ.spot-drain.js.snapshot/tree.json | 3203 +---------------
...efaultTestDeployAssert4CDF4940.assets.json | 5 +-
.../aws-ecs-integ.assets.json | 9 +-
.../aws-ecs-integ.template.json | 4 +-
.../integ.swap-parameters.js.snapshot/cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
.../tree.json | 2199 +----------
...cdk-ecs-integration-test-stack.assets.json | 6 +-
...k-ecs-integration-test-stack.template.json | 4 +-
.../manifest.json | 7 +-
.../tree.json | 2 +-
.../cdk-ecs-fluentd.assets.json | 8 +-
.../cdk-ecs-fluentd.template.json | 4 +-
.../integ.fluentd-driver.js.snapshot/cdk.out | 2 +-
...efaultTestDeployAssert52981939.assets.json | 4 +-
.../integ.json | 4 +-
.../manifest.json | 520 ++-
.../tree.json | 2 +-
.../manifest.json | 5 +-
...efaultTestDeployAssertD0596FC1.assets.json | 5 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 631 +++-
.../test-efs-integ.assets.json | 5 +-
.../tree.json | 933 +----
.../manifest.json | 5 +-
...efaultTestDeployAssert8B2741C4.assets.json | 5 +-
.../aws-ecs-integ-ecs.assets.json | 12 +-
.../aws-ecs-integ-ecs.template.json | 4 +-
.../integ.event-ec2-task.js.snapshot/cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
.../tree.json | 2383 +-----------
...-cdk-ecs-run-task-ec2-schedule.assets.json | 6 +-
...dk-ecs-run-task-ec2-schedule.template.json | 4 +-
...efaultTestDeployAssert078FB53C.assets.json | 6 +-
...aultTestDeployAssert078FB53C.template.json | 6 +-
.../manifest.json | 9 +-
.../tree.json | 2 +-
...efaultTestDeployAssert2569343D.assets.json | 5 +-
...s-run-task-ref-task-definition.assets.json | 12 +-
...run-task-ref-task-definition.template.json | 4 +-
.../cdk.out | 2 +-
.../integ.json | 5 +-
.../manifest.json | 521 ++-
.../tree.json | 2711 +------------
...efaultTestDeployAssert2569343D.assets.json | 5 +-
.../aws-sfn-tasks-ecs-run-task.assets.json | 12 +-
.../aws-sfn-tasks-ecs-run-task.template.json | 4 +-
.../integ.ec2-run-task.js.snapshot/cdk.out | 2 +-
.../integ.ec2-run-task.js.snapshot/integ.json | 5 +-
.../manifest.json | 521 ++-
.../integ.ec2-run-task.js.snapshot/tree.json | 2782 +-------------
...efaultTestDeployAssert9E1A388C.assets.json | 5 +-
.../aws-sfn-tasks-ecs-task.assets.json | 12 +-
.../aws-sfn-tasks-ecs-task.template.json | 4 +-
.../ecs/integ.ec2-task.js.snapshot/cdk.out | 2 +-
.../ecs/integ.ec2-task.js.snapshot/integ.json | 5 +-
.../integ.ec2-task.js.snapshot/manifest.json | 521 ++-
.../ecs/integ.ec2-task.js.snapshot/tree.json | 2668 +------------
270 files changed, 21853 insertions(+), 77528 deletions(-)
create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03/Dockerfile
create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-isolated.js.snapshot/asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03/index.py
create mode 100644 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
create mode 100644 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
delete mode 100644 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
delete mode 100644 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
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 19f6e15e51e30..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": {
@@ -1595,4 +1595,4 @@
]
}
}
-}
+}
\ 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/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 2735dd0937070..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": {
@@ -1269,4 +1269,4 @@
]
}
}
-}
+}
\ 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/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 907870e6b3132..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": {
@@ -1234,4 +1234,4 @@
]
}
}
-}
+}
\ 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/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/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 d7be7706d9c65..9506cf4c38e5a 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
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"artifacts": {
"tls-network-load-balanced-ecs-service.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}/5fd45beb63c2f69f735cca8021ff134814b5e0519890c5561034fb91e1051959.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/d6a75638064bcaef0a9ae479003579a6f009cbf8f65cf97280d57ccb045ac636.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1556,6 +1556,7 @@
"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."
},
@@ -1708,5 +1709,5 @@
}
}
},
- "minimumCliVersion": "2.1020.2"
+ "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.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 55b822812fc2d..ced5024f107b9 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
@@ -15,16 +15,16 @@
}
}
},
- "5fd45beb63c2f69f735cca8021ff134814b5e0519890c5561034fb91e1051959": {
+ "d6a75638064bcaef0a9ae479003579a6f009cbf8f65cf97280d57ccb045ac636": {
"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-a3286fc9": {
+ "current_account-current_region-b236818e": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "5fd45beb63c2f69f735cca8021ff134814b5e0519890c5561034fb91e1051959.json",
+ "objectKey": "d6a75638064bcaef0a9ae479003579a6f009cbf8f65cf97280d57ccb045ac636.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 4a4c4198dc5b6..b35ac1ca79a64 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
@@ -880,7 +880,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": {
@@ -1418,4 +1418,4 @@
]
}
}
-}
+}
\ 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/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 86af20b8c73ec..06e86aa4a0f3e 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"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"tls-network-load-balanced-ecs-service/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"tls-network-load-balanced-ecs-service/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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 23b9c94ad8b04..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": {
@@ -1088,4 +1088,4 @@
]
}
}
-}
+}
\ 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/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 541dc9ce88f33..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.13",
- "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"
- }
- }
-}
+{"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 18057f1b908d8..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": {
@@ -999,4 +999,4 @@
]
}
}
-}
+}
\ 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/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 4cec68f64fc24..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.13",
- "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"
- }
- }
-}
+{"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 08218c0e499ec..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": {
@@ -926,4 +926,4 @@
]
}
}
-}
+}
\ No newline at end of file
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 3bf3e96a68c01..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.13",
- "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"
- }
- }
-}
+{"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 76357d478437e..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": {
@@ -1033,4 +1033,4 @@
]
}
}
-}
+}
\ 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.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 82b64acfce66d..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.13",
- "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"
- }
- }
-}
+{"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 3516b59e7f34b..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": {
@@ -1117,4 +1117,4 @@
]
}
}
-}
+}
\ 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/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 2941225dbeb94..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.13",
- "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"
- }
- }
-}
+{"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 3ca1704ac524b..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": {
@@ -880,4 +880,4 @@
]
}
}
-}
+}
\ 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/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 d75d71450cc2b..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.13",
- "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"
- }
- }
-}
+{"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 5fe9ebb7f41fb..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": {
@@ -1037,4 +1037,4 @@
]
}
}
-}
+}
\ 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.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 5c4d968b051ab..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.13",
- "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"
- }
- }
-}
+{"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/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 83fd82619683c..88d1c35f8be5c 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
@@ -15,16 +15,16 @@
}
}
},
- "6aef79cefd7ff5a726919857862d26a634c5a01054d1335a890b6ef5ab4d64da": {
+ "92212a4a2a41077ea6d6fe25ba2439339f11d410981eff9f0dbac91c2d764222": {
"displayName": "integ-deployment-alarms Template",
"source": {
"path": "integ-deployment-alarms.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region-e79d0688": {
+ "current_account-current_region-d5abf1e4": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "6aef79cefd7ff5a726919857862d26a634c5a01054d1335a890b6ef5ab4d64da.json",
+ "objectKey": "92212a4a2a41077ea6d6fe25ba2439339f11d410981eff9f0dbac91c2d764222.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 7db7ee1648a06..8653620b8bd76 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
@@ -921,7 +921,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": {
@@ -1329,4 +1329,4 @@
]
}
}
-}
+}
\ 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 a349bd90b4887..54cf9b8fee18d 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
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"artifacts": {
"integ-deployment-alarms.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}/6aef79cefd7ff5a726919857862d26a634c5a01054d1335a890b6ef5ab4d64da.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/92212a4a2a41077ea6d6fe25ba2439339f11d410981eff9f0dbac91c2d764222.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1409,6 +1409,7 @@
"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."
},
@@ -1561,5 +1562,5 @@
}
}
},
- "minimumCliVersion": "2.1020.2"
+ "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.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 d7aaca65e965d..14f553e45745f 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"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"integ-deployment-alarms/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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"}}}}}
+{"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"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"integ-deployment-alarms/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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 a8c5e2a0fc548..b38ef59bb9c6d 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
@@ -15,16 +15,16 @@
}
}
},
- "72acc38175b85f802a9057a5da620723c06fbbab75081821a6b33c5d1f238f2c": {
+ "4197472bcaeaaccc6beed0f4eef4cc0039b68766d6e3edecb6e1328b306e0104": {
"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-d9764433": {
+ "current_account-current_region-f0fb0b6e": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "72acc38175b85f802a9057a5da620723c06fbbab75081821a6b33c5d1f238f2c.json",
+ "objectKey": "4197472bcaeaaccc6beed0f4eef4cc0039b68766d6e3edecb6e1328b306e0104.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 19d8cce18d3d1..36741d411850b 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
@@ -992,7 +992,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": {
@@ -1379,4 +1379,4 @@
]
}
}
-}
+}
\ 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 4b885eb79bcef..d1f231b75b7ef 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
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-ecs-integ-enable-execute-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}/72acc38175b85f802a9057a5da620723c06fbbab75081821a6b33c5d1f238f2c.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/4197472bcaeaaccc6beed0f4eef4cc0039b68766d6e3edecb6e1328b306e0104.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1533,6 +1533,7 @@
"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."
},
@@ -1685,5 +1686,5 @@
}
}
},
- "minimumCliVersion": "2.1020.2"
+ "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.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 5fba5a2c4edde..66a721d9c3d17 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"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"aws-ecs-integ-enable-execute-command/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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"}}}}}
+{"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"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"aws-ecs-integ-enable-execute-command/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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 cb98c87a90843..8eb1acd75c912 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 @@
}
}
},
- "ea6b367b69d9f046d2391d433da4e2caa7c3433886fab593305313c0269969b6": {
+ "8bdf302e755fd27a44290ccaac99b9926f72f962c98702b73dc4585ec1c006c4": {
"displayName": "aws-ecs-integ Template",
"source": {
"path": "aws-ecs-integ.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region-d59aa41e": {
+ "current_account-current_region-8c01a352": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "ea6b367b69d9f046d2391d433da4e2caa7c3433886fab593305313c0269969b6.json",
+ "objectKey": "8bdf302e755fd27a44290ccaac99b9926f72f962c98702b73dc4585ec1c006c4.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 fc5428ad3bd7b..af1c0e2121786 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
@@ -915,7 +915,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": {
@@ -1612,4 +1612,4 @@
]
}
}
-}
+}
\ 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 f064cb84c32e1..21ed6a270a78d 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
@@ -1,5 +1,5 @@
{
- "version": "45.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}/ea6b367b69d9f046d2391d433da4e2caa7c3433886fab593305313c0269969b6.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/8bdf302e755fd27a44290ccaac99b9926f72f962c98702b73dc4585ec1c006c4.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1680,6 +1680,7 @@
"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."
},
@@ -1832,5 +1833,5 @@
}
}
},
- "minimumCliVersion": "2.1020.2"
+ "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.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 47ef89871c211..9ce9174bec6f8 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"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"aws-ecs-integ/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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":"9a1fcb4a7ecba81ad70e9d3fb241f6794497da945dae5f25924e4dd002b65f2d.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"}}}}}
+{"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"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"aws-ecs-integ/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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":"9a1fcb4a7ecba81ad70e9d3fb241f6794497da945dae5f25924e4dd002b65f2d.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 10a8ad888abe9..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": {
@@ -1256,4 +1256,4 @@
]
}
}
-}
+}
\ 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/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 4acfb00aea9af..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.13",
- "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"
- }
- }
-}
+{"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 1d56985f597e4..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": {
@@ -1225,4 +1225,4 @@
]
}
}
-}
+}
\ 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/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 cfc2da614123f..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.13",
- "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"
- }
- }
-}
+{"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 84c1ec4d29ede..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": {
@@ -962,4 +962,4 @@
]
}
}
-}
+}
\ 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/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 a10188096067a..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.13",
- "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"
- }
- }
-}
+{"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 d3398e4653e89..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": {
@@ -936,4 +936,4 @@
]
}
}
-}
+}
\ No newline at end of file
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 5420b161dad9c..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.13",
- "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"
- }
- }
-}
+{"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 701e54addeb0a..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": {
@@ -1211,4 +1211,4 @@
]
}
}
-}
+}
\ 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/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 d9cddb5611709..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.13",
- "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"
- }
- }
-}
+{"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 e9a4394b196e9..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": {
@@ -1157,4 +1157,4 @@
]
}
}
-}
+}
\ 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/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 b9b16a3605f46..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.13",
- "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"
- }
- }
-}
+{"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 ebf0b18462c1e..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": {
@@ -999,4 +999,4 @@
]
}
}
-}
+}
\ 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/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 95256f80848cf..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.13",
- "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"
- }
- }
-}
+{"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 8ba1f2ec10dca..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": {
@@ -1008,4 +1008,4 @@
]
}
}
-}
+}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs/test/ec2/integ.placement-strategies.js.snapshot/cdk.out
index 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 15886baf7b02c..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.13",
- "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"
- }
- }
-}
+{"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 3c29969b1319f..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": {
@@ -1047,4 +1047,4 @@
]
}
}
-}
+}
\ 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/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 7fae8e6fbbd66..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.13",
- "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"
- }
- }
-}
+{"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 f803e9db7a682..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": {
@@ -1105,4 +1105,4 @@
]
}
}
-}
+}
\ 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/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 b1279d0948389..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.13",
- "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"
- }
- }
-}
+{"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 d100a10bc4d1c..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": {
@@ -1059,4 +1059,4 @@
]
}
}
-}
+}
\ 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/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 15855a30b6322..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.13",
- "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"
- }
- }
-}
+{"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 0642b2e79c8c4..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": {
@@ -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": {
@@ -1516,4 +1516,4 @@
]
}
}
-}
+}
\ 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/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 de15c34282c69..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.13",
- "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.13",
- "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"
- }
- }
-}
+{"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 f88cdefb0af65..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": {
@@ -1043,4 +1043,4 @@
]
}
}
-}
+}
\ 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/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 bafca04274e8d..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.13",
- "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"
- }
- }
-}
+{"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 c81a287edbbf2..b413c4d1e592d 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
@@ -15,16 +15,16 @@
}
}
},
- "d3713ef5078be59de118dbfe18e845147a64f6e89353079682fe357914c03a66": {
+ "1eaf125969457dc8b350b0b8a917d45cfc6a5a10f4f29cad26991c053c253c5a": {
"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-eddd31ef": {
+ "current_account-current_region-1eec1a33": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "d3713ef5078be59de118dbfe18e845147a64f6e89353079682fe357914c03a66.json",
+ "objectKey": "1eaf125969457dc8b350b0b8a917d45cfc6a5a10f4f29cad26991c053c253c5a.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 39dbee2c204eb..db8f8ea78c159 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
@@ -879,7 +879,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": {
@@ -1264,4 +1264,4 @@
]
}
}
-}
+}
\ 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 f710951da2978..f230e05a982e7 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
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"artifacts": {
"awscdkecsintegrationteststackTaskDefinitionPlacementConstraintsDefaultTestDeployAssert906A0CF3.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}/d3713ef5078be59de118dbfe18e845147a64f6e89353079682fe357914c03a66.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/1eaf125969457dc8b350b0b8a917d45cfc6a5a10f4f29cad26991c053c253c5a.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1396,6 +1396,7 @@
"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."
},
@@ -1548,5 +1549,5 @@
}
}
},
- "minimumCliVersion": "2.1020.2"
+ "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.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 18a4e7cf6b0bd..22b86e7f4d8cd 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"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"aws-cdk-ecs-integration-test-stack/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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"}}}}}
+{"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"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"aws-cdk-ecs-integration-test-stack/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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/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 50eb33cbf7f33..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": {
@@ -872,4 +872,4 @@
]
}
}
-}
+}
\ 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.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 150ac0ad69845..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.13","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"}}}
+{"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-one-zone.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-one-zone.js.snapshot/manifest.json
index a666284d288de..40176fa26fe39 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-one-zone.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-one-zone.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"artifacts": {
"test-efs-one-zone-integ.assets": {
"type": "cdk:asset-manifest",
@@ -801,6 +801,7 @@
"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."
},
@@ -953,5 +954,5 @@
}
}
},
- "minimumCliVersion": "2.1020.2"
+ "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/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-efs/test/integ.efs-filesystem-protection.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-protection.js.snapshot/manifest.json
index f32c0c3347d8a..2698e04de7b75 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-protection.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-efs/test/integ.efs-filesystem-protection.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"artifacts": {
"test-efs-protection-integ.assets": {
"type": "cdk:asset-manifest",
@@ -712,6 +712,7 @@
"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."
},
@@ -864,5 +865,5 @@
}
}
},
- "minimumCliVersion": "2.1020.2"
+ "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/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 33125a94d6321..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": {
@@ -1078,4 +1078,4 @@
]
}
}
-}
+}
\ 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/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-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 7a3b0b248cfa9..6002483f351db 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 @@
}
}
},
- "ac59c17093a11c183d32846fdca0f09a9e2a49fab55544a177176d3c8142f0f1": {
+ "15138caedd6ff8eaa74929abb6010422ee305e06ec04540acc57d1c416437d06": {
"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-7e5b618d": {
+ "current_account-current_region-7132ef74": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "ac59c17093a11c183d32846fdca0f09a9e2a49fab55544a177176d3c8142f0f1.json",
+ "objectKey": "15138caedd6ff8eaa74929abb6010422ee305e06ec04540acc57d1c416437d06.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 d39c8ad908031..c7b3bab90cfa5 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
@@ -716,7 +716,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": {
@@ -1263,4 +1263,4 @@
]
}
}
-}
+}
\ 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 ef5fab2322ff7..057009e2d8508 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
@@ -14,16 +14,16 @@
}
}
},
- "d9783beb00b0c9c760d13c2273d44c72ea249381bddc5c7d4b0c08e17f8e970f": {
+ "7f9c2bd163cca05fc5395364c0d09d766f785b92ab25b3300de3419ad1833f66": {
"displayName": "integecsruntaskec2DefaultTestDeployAssert078FB53C Template",
"source": {
"path": "integecsruntaskec2DefaultTestDeployAssert078FB53C.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region-9e76806f": {
+ "current_account-current_region-51a44709": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "d9783beb00b0c9c760d13c2273d44c72ea249381bddc5c7d4b0c08e17f8e970f.json",
+ "objectKey": "7f9c2bd163cca05fc5395364c0d09d766f785b92ab25b3300de3419ad1833f66.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 602454129c61e..554517a08715b 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": "1753352823451"
+ "salt": "1753805124712"
},
"UpdateReplacePolicy": "Delete",
"DeletionPolicy": "Delete"
@@ -431,7 +431,7 @@
}
},
"flattenResponse": "false",
- "salt": "1753352823455"
+ "salt": "1753805124717"
},
"UpdateReplacePolicy": "Delete",
"DeletionPolicy": "Delete"
@@ -481,7 +481,7 @@
}
},
"flattenResponse": "false",
- "salt": "1753352823456"
+ "salt": "1753805124718"
},
"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 5289028397dd1..276f1d8a8dd34 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
@@ -1,5 +1,5 @@
{
- "version": "45.0.0",
+ "version": "48.0.0",
"artifacts": {
"aws-cdk-ecs-run-task-ec2-schedule.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}/ac59c17093a11c183d32846fdca0f09a9e2a49fab55544a177176d3c8142f0f1.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/15138caedd6ff8eaa74929abb6010422ee305e06ec04540acc57d1c416437d06.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1060,7 +1060,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}/d9783beb00b0c9c760d13c2273d44c72ea249381bddc5c7d4b0c08e17f8e970f.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/7f9c2bd163cca05fc5395364c0d09d766f785b92ab25b3300de3419ad1833f66.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [
@@ -1577,6 +1577,7 @@
"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."
},
@@ -1729,5 +1730,5 @@
}
}
},
- "minimumCliVersion": "2.1020.2"
+ "minimumCliVersion": "2.1023.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 979465edcda64..57c892f4bd6a6 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"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"aws-cdk-ecs-run-task-ec2-schedule/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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"}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"aws-cdk-ecs-run-task-ec2-schedule/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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"}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"integ-ecs-run-task-ec2/DefaultTest/DeployAssert/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","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 eb73b2133057f..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": {
@@ -1293,4 +1293,4 @@
]
}
}
-}
+}
\ 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/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 c0703e16d91ec..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": {
@@ -1330,4 +1330,4 @@
]
}
}
-}
+}
\ 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/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 47c2193c8d694..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": {
@@ -1218,4 +1218,4 @@
]
}
}
-}
+}
\ 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/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
From dee411a4736ea9bb8915593b7ff28925db7673a3 Mon Sep 17 00:00:00 2001
From: Abdelrahman Abdelrahman
Date: Mon, 4 Aug 2025 11:58:59 +0000
Subject: [PATCH 4/4] fix(lambda): snapshots update
---
...JsLatestIntegDefaultTestDeployAssertD40B5C28.assets.json | 6 +++---
...LatestIntegDefaultTestDeployAssertD40B5C28.template.json | 2 +-
.../test/integ.latest.js.snapshot/manifest.json | 2 +-
3 files changed, 5 insertions(+), 5 deletions(-)
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 0a3f9aa0ed306..d9c146a316c2f 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 @@
}
}
},
- "0e69c268a2e5f4b3f69198fbce45a6173a33875108bd47a8343871917d2765ab": {
+ "d433aef881b52f8c84087d33515dbed919e5ca5b0516bd23dbe29b2dc6f4fda8": {
"displayName": "LambdaNodeJsLatestIntegDefaultTestDeployAssertD40B5C28 Template",
"source": {
"path": "LambdaNodeJsLatestIntegDefaultTestDeployAssertD40B5C28.template.json",
"packaging": "file"
},
"destinations": {
- "current_account-current_region-72c804d2": {
+ "current_account-current_region-668e327b": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
- "objectKey": "0e69c268a2e5f4b3f69198fbce45a6173a33875108bd47a8343871917d2765ab.json",
+ "objectKey": "d433aef881b52f8c84087d33515dbed919e5ca5b0516bd23dbe29b2dc6f4fda8.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 7b4c7896cccd7..e9f1983314a3d 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": "1754052061015"
+ "salt": "1754308665521"
},
"UpdateReplacePolicy": "Delete",
"DeletionPolicy": "Delete"
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 5c62303922dad..4c40a40b02df8 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}/0e69c268a2e5f4b3f69198fbce45a6173a33875108bd47a8343871917d2765ab.json",
+ "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/d433aef881b52f8c84087d33515dbed919e5ca5b0516bd23dbe29b2dc6f4fda8.json",
"requiresBootstrapStackVersion": 6,
"bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
"additionalDependencies": [