diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03/Dockerfile b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-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-backlog-per-instance-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-backlog-per-instance-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-backlog-per-instance-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-backlog-per-instance-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-backlog-per-instance-scaling.js.snapshot/asset.a1acfc2b5f4f6b183fd2bb9863f486bc5edef6a357b355a070d9a0e502df418c/__entrypoint__.js b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/asset.a1acfc2b5f4f6b183fd2bb9863f486bc5edef6a357b355a070d9a0e502df418c/__entrypoint__.js new file mode 100644 index 0000000000000..ff3a517fba12d --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/asset.a1acfc2b5f4f6b183fd2bb9863f486bc5edef6a357b355a070d9a0e502df418c/__entrypoint__.js @@ -0,0 +1,155 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.external = void 0; +exports.handler = handler; +exports.withRetries = withRetries; +const https = require("https"); +const url = require("url"); +// for unit tests +exports.external = { + sendHttpRequest: defaultSendHttpRequest, + log: defaultLog, + includeStackTraces: true, + userHandlerIndex: './index', +}; +const CREATE_FAILED_PHYSICAL_ID_MARKER = 'AWSCDK::CustomResourceProviderFramework::CREATE_FAILED'; +const MISSING_PHYSICAL_ID_MARKER = 'AWSCDK::CustomResourceProviderFramework::MISSING_PHYSICAL_ID'; +async function handler(event, context) { + const sanitizedEvent = { ...event, ResponseURL: '...' }; + exports.external.log(JSON.stringify(sanitizedEvent, undefined, 2)); + // ignore DELETE event when the physical resource ID is the marker that + // indicates that this DELETE is a subsequent DELETE to a failed CREATE + // operation. + if (event.RequestType === 'Delete' && event.PhysicalResourceId === CREATE_FAILED_PHYSICAL_ID_MARKER) { + exports.external.log('ignoring DELETE event caused by a failed CREATE event'); + await submitResponse('SUCCESS', event); + return; + } + try { + // invoke the user handler. this is intentionally inside the try-catch to + // ensure that if there is an error it's reported as a failure to + // cloudformation (otherwise cfn waits). + // eslint-disable-next-line @typescript-eslint/no-require-imports + const userHandler = require(exports.external.userHandlerIndex).handler; + const result = await userHandler(sanitizedEvent, context); + // validate user response and create the combined event + const responseEvent = renderResponse(event, result); + // submit to cfn as success + await submitResponse('SUCCESS', responseEvent); + } + catch (e) { + const resp = { + ...event, + Reason: exports.external.includeStackTraces ? e.stack : e.message, + }; + if (!resp.PhysicalResourceId) { + // special case: if CREATE fails, which usually implies, we usually don't + // have a physical resource id. in this case, the subsequent DELETE + // operation does not have any meaning, and will likely fail as well. to + // address this, we use a marker so the provider framework can simply + // ignore the subsequent DELETE. + if (event.RequestType === 'Create') { + exports.external.log('CREATE failed, responding with a marker physical resource id so that the subsequent DELETE will be ignored'); + resp.PhysicalResourceId = CREATE_FAILED_PHYSICAL_ID_MARKER; + } + else { + // otherwise, if PhysicalResourceId is not specified, something is + // terribly wrong because all other events should have an ID. + exports.external.log(`ERROR: Malformed event. "PhysicalResourceId" is required: ${JSON.stringify(event)}`); + } + } + // this is an actual error, fail the activity altogether and exist. + await submitResponse('FAILED', resp); + } +} +function renderResponse(cfnRequest, handlerResponse = {}) { + // if physical ID is not returned, we have some defaults for you based + // on the request type. + const physicalResourceId = handlerResponse.PhysicalResourceId ?? cfnRequest.PhysicalResourceId ?? cfnRequest.RequestId; + // if we are in DELETE and physical ID was changed, it's an error. + if (cfnRequest.RequestType === 'Delete' && physicalResourceId !== cfnRequest.PhysicalResourceId) { + throw new Error(`DELETE: cannot change the physical resource ID from "${cfnRequest.PhysicalResourceId}" to "${handlerResponse.PhysicalResourceId}" during deletion`); + } + // merge request event and result event (result prevails). + return { + ...cfnRequest, + ...handlerResponse, + PhysicalResourceId: physicalResourceId, + }; +} +async function submitResponse(status, event) { + const json = { + Status: status, + Reason: event.Reason ?? status, + StackId: event.StackId, + RequestId: event.RequestId, + PhysicalResourceId: event.PhysicalResourceId || MISSING_PHYSICAL_ID_MARKER, + LogicalResourceId: event.LogicalResourceId, + NoEcho: event.NoEcho, + Data: event.Data, + }; + const parsedUrl = url.parse(event.ResponseURL); + const loggingSafeUrl = `${parsedUrl.protocol}//${parsedUrl.hostname}/${parsedUrl.pathname}?***`; + exports.external.log('submit response to cloudformation', loggingSafeUrl, json); + const responseBody = JSON.stringify(json); + const req = { + hostname: parsedUrl.hostname, + path: parsedUrl.path, + method: 'PUT', + headers: { + 'content-type': '', + 'content-length': Buffer.byteLength(responseBody, 'utf8'), + }, + }; + const retryOptions = { + attempts: 5, + sleep: 1000, + }; + await withRetries(retryOptions, exports.external.sendHttpRequest)(req, responseBody); +} +async function defaultSendHttpRequest(options, requestBody) { + return new Promise((resolve, reject) => { + try { + const request = https.request(options, (response) => { + response.resume(); // Consume the response but don't care about it + if (!response.statusCode || response.statusCode >= 400) { + reject(new Error(`Unsuccessful HTTP response: ${response.statusCode}`)); + } + else { + resolve(); + } + }); + request.on('error', reject); + request.write(requestBody); + request.end(); + } + catch (e) { + reject(e); + } + }); +} +function defaultLog(fmt, ...params) { + // eslint-disable-next-line no-console + console.log(fmt, ...params); +} +function withRetries(options, fn) { + return async (...xs) => { + let attempts = options.attempts; + let ms = options.sleep; + while (true) { + try { + return await fn(...xs); + } + catch (e) { + if (attempts-- <= 0) { + throw e; + } + await sleep(Math.floor(Math.random() * ms)); + ms *= 2; + } + } + }; +} +async function sleep(ms) { + return new Promise((ok) => setTimeout(ok, ms)); +} diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/asset.a1acfc2b5f4f6b183fd2bb9863f486bc5edef6a357b355a070d9a0e502df418c/index.js b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/asset.a1acfc2b5f4f6b183fd2bb9863f486bc5edef6a357b355a070d9a0e502df418c/index.js new file mode 100644 index 0000000000000..013bcaffd8fe5 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/asset.a1acfc2b5f4f6b183fd2bb9863f486bc5edef6a357b355a070d9a0e502df418c/index.js @@ -0,0 +1 @@ +"use strict";var I=Object.create;var t=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var g=Object.getPrototypeOf,l=Object.prototype.hasOwnProperty;var G=(r,e)=>{for(var o in e)t(r,o,{get:e[o],enumerable:!0})},n=(r,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of P(e))!l.call(r,s)&&s!==o&&t(r,s,{get:()=>e[s],enumerable:!(i=y(e,s))||i.enumerable});return r};var R=(r,e,o)=>(o=r!=null?I(g(r)):{},n(e||!r||!r.__esModule?t(o,"default",{value:r,enumerable:!0}):o,r)),S=r=>n(t({},"__esModule",{value:!0}),r);var k={};G(k,{handler:()=>f});module.exports=S(k);var a=R(require("@aws-sdk/client-ec2")),u=new a.EC2({});function c(r,e){return{GroupId:r,IpPermissions:[{UserIdGroupPairs:[{GroupId:r,UserId:e}],IpProtocol:"-1"}]}}function d(r){return{GroupId:r,IpPermissions:[{IpRanges:[{CidrIp:"0.0.0.0/0"}],IpProtocol:"-1"}]}}async function f(r){let e=r.ResourceProperties.DefaultSecurityGroupId,o=r.ResourceProperties.Account;switch(r.RequestType){case"Create":return p(e,o);case"Update":return h(r);case"Delete":return m(e,o)}}async function h(r){let e=r.OldResourceProperties.DefaultSecurityGroupId,o=r.ResourceProperties.DefaultSecurityGroupId;e!==o&&(await m(e,r.ResourceProperties.Account),await p(o,r.ResourceProperties.Account))}async function p(r,e){try{await u.revokeSecurityGroupEgress(d(r))}catch(o){if(o.name!=="InvalidPermission.NotFound")throw o}try{await u.revokeSecurityGroupIngress(c(r,e))}catch(o){if(o.name!=="InvalidPermission.NotFound")throw o}}async function m(r,e){await u.authorizeSecurityGroupIngress(c(r,e)),await u.authorizeSecurityGroupEgress(d(r))}0&&(module.exports={handler}); diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/aws-ecs-patterns-queue-backlog-per-instance-scaling.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/aws-ecs-patterns-queue-backlog-per-instance-scaling.assets.json new file mode 100644 index 0000000000000..35cab62fa2a1f --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/aws-ecs-patterns-queue-backlog-per-instance-scaling.assets.json @@ -0,0 +1,48 @@ +{ + "version": "41.0.0", + "files": { + "a1acfc2b5f4f6b183fd2bb9863f486bc5edef6a357b355a070d9a0e502df418c": { + "displayName": "aws-ecs-patterns-queue-backlog-per-instance-scaling/Custom::VpcRestrictDefaultSGCustomResourceProvider Code", + "source": { + "path": "asset.a1acfc2b5f4f6b183fd2bb9863f486bc5edef6a357b355a070d9a0e502df418c", + "packaging": "zip" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "a1acfc2b5f4f6b183fd2bb9863f486bc5edef6a357b355a070d9a0e502df418c.zip", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + }, + "9e39fe8a08325ec3ac063b342a98976a5b0337c371d7fcbf6567aac21b95a95d": { + "displayName": "aws-ecs-patterns-queue-backlog-per-instance-scaling Template", + "source": { + "path": "aws-ecs-patterns-queue-backlog-per-instance-scaling.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "9e39fe8a08325ec3ac063b342a98976a5b0337c371d7fcbf6567aac21b95a95d.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": { + "205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03": { + "displayName": "backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage", + "source": { + "directory": "asset.205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03" + }, + "destinations": { + "current_account-current_region": { + "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}" + } + } + } + } +} \ 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-backlog-per-instance-scaling.js.snapshot/aws-ecs-patterns-queue-backlog-per-instance-scaling.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/aws-ecs-patterns-queue-backlog-per-instance-scaling.template.json new file mode 100644 index 0000000000000..93021b9c48be2 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/aws-ecs-patterns-queue-backlog-per-instance-scaling.template.json @@ -0,0 +1,1088 @@ +{ + "Resources": { + "CdkAppQueueFB2A6F8C": { + "Type": "AWS::SQS::Queue", + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "EcsCluster97242B84": { + "Type": "AWS::ECS::Cluster", + "Properties": { + "ClusterSettings": [ + { + "Name": "containerInsights", + "Value": "enabled" + } + ] + } + }, + "EcsClusterVpc779914AB": { + "Type": "AWS::EC2::VPC", + "Properties": { + "CidrBlock": "10.0.0.0/16", + "EnableDnsHostnames": true, + "EnableDnsSupport": true, + "InstanceTenancy": "default", + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc" + } + ] + } + }, + "EcsClusterVpcPublicSubnet1Subnet4AC37B0F": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "AvailabilityZone": { + "Fn::Select": [ + 0, + { + "Fn::GetAZs": "" + } + ] + }, + "CidrBlock": "10.0.0.0/18", + "MapPublicIpOnLaunch": true, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "Public" + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Public" + }, + { + "Key": "Name", + "Value": "aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1" + } + ], + "VpcId": { + "Ref": "EcsClusterVpc779914AB" + } + } + }, + "EcsClusterVpcPublicSubnet1RouteTable4AE3113D": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1" + } + ], + "VpcId": { + "Ref": "EcsClusterVpc779914AB" + } + } + }, + "EcsClusterVpcPublicSubnet1RouteTableAssociation49C4CDBB": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "EcsClusterVpcPublicSubnet1RouteTable4AE3113D" + }, + "SubnetId": { + "Ref": "EcsClusterVpcPublicSubnet1Subnet4AC37B0F" + } + } + }, + "EcsClusterVpcPublicSubnet1DefaultRoute8C7EFC96": { + "Type": "AWS::EC2::Route", + "Properties": { + "DestinationCidrBlock": "0.0.0.0/0", + "GatewayId": { + "Ref": "EcsClusterVpcIGW3663B083" + }, + "RouteTableId": { + "Ref": "EcsClusterVpcPublicSubnet1RouteTable4AE3113D" + } + }, + "DependsOn": [ + "EcsClusterVpcVPCGW944296C0" + ] + }, + "EcsClusterVpcPublicSubnet1EIP2D3759A3": { + "Type": "AWS::EC2::EIP", + "Properties": { + "Domain": "vpc", + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1" + } + ] + } + }, + "EcsClusterVpcPublicSubnet1NATGateway2F1E7764": { + "Type": "AWS::EC2::NatGateway", + "Properties": { + "AllocationId": { + "Fn::GetAtt": [ + "EcsClusterVpcPublicSubnet1EIP2D3759A3", + "AllocationId" + ] + }, + "SubnetId": { + "Ref": "EcsClusterVpcPublicSubnet1Subnet4AC37B0F" + }, + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1" + } + ] + }, + "DependsOn": [ + "EcsClusterVpcPublicSubnet1DefaultRoute8C7EFC96", + "EcsClusterVpcPublicSubnet1RouteTableAssociation49C4CDBB" + ] + }, + "EcsClusterVpcPublicSubnet2Subnet4A959A4C": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "AvailabilityZone": { + "Fn::Select": [ + 1, + { + "Fn::GetAZs": "" + } + ] + }, + "CidrBlock": "10.0.64.0/18", + "MapPublicIpOnLaunch": true, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "Public" + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Public" + }, + { + "Key": "Name", + "Value": "aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2" + } + ], + "VpcId": { + "Ref": "EcsClusterVpc779914AB" + } + } + }, + "EcsClusterVpcPublicSubnet2RouteTable89A2F6C5": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2" + } + ], + "VpcId": { + "Ref": "EcsClusterVpc779914AB" + } + } + }, + "EcsClusterVpcPublicSubnet2RouteTableAssociationE4D42FC1": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "EcsClusterVpcPublicSubnet2RouteTable89A2F6C5" + }, + "SubnetId": { + "Ref": "EcsClusterVpcPublicSubnet2Subnet4A959A4C" + } + } + }, + "EcsClusterVpcPublicSubnet2DefaultRoute048730F7": { + "Type": "AWS::EC2::Route", + "Properties": { + "DestinationCidrBlock": "0.0.0.0/0", + "GatewayId": { + "Ref": "EcsClusterVpcIGW3663B083" + }, + "RouteTableId": { + "Ref": "EcsClusterVpcPublicSubnet2RouteTable89A2F6C5" + } + }, + "DependsOn": [ + "EcsClusterVpcVPCGW944296C0" + ] + }, + "EcsClusterVpcPublicSubnet2EIP26E3EEEF": { + "Type": "AWS::EC2::EIP", + "Properties": { + "Domain": "vpc", + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2" + } + ] + } + }, + "EcsClusterVpcPublicSubnet2NATGatewayBD015416": { + "Type": "AWS::EC2::NatGateway", + "Properties": { + "AllocationId": { + "Fn::GetAtt": [ + "EcsClusterVpcPublicSubnet2EIP26E3EEEF", + "AllocationId" + ] + }, + "SubnetId": { + "Ref": "EcsClusterVpcPublicSubnet2Subnet4A959A4C" + }, + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2" + } + ] + }, + "DependsOn": [ + "EcsClusterVpcPublicSubnet2DefaultRoute048730F7", + "EcsClusterVpcPublicSubnet2RouteTableAssociationE4D42FC1" + ] + }, + "EcsClusterVpcPrivateSubnet1SubnetFAB0E487": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "AvailabilityZone": { + "Fn::Select": [ + 0, + { + "Fn::GetAZs": "" + } + ] + }, + "CidrBlock": "10.0.128.0/18", + "MapPublicIpOnLaunch": false, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "Private" + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Private" + }, + { + "Key": "Name", + "Value": "aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet1" + } + ], + "VpcId": { + "Ref": "EcsClusterVpc779914AB" + } + } + }, + "EcsClusterVpcPrivateSubnet1RouteTable2EA148EE": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet1" + } + ], + "VpcId": { + "Ref": "EcsClusterVpc779914AB" + } + } + }, + "EcsClusterVpcPrivateSubnet1RouteTableAssociationF4E8ACD7": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "EcsClusterVpcPrivateSubnet1RouteTable2EA148EE" + }, + "SubnetId": { + "Ref": "EcsClusterVpcPrivateSubnet1SubnetFAB0E487" + } + } + }, + "EcsClusterVpcPrivateSubnet1DefaultRoute0239F5D0": { + "Type": "AWS::EC2::Route", + "Properties": { + "DestinationCidrBlock": "0.0.0.0/0", + "NatGatewayId": { + "Ref": "EcsClusterVpcPublicSubnet1NATGateway2F1E7764" + }, + "RouteTableId": { + "Ref": "EcsClusterVpcPrivateSubnet1RouteTable2EA148EE" + } + } + }, + "EcsClusterVpcPrivateSubnet2SubnetC2B7B1BA": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "AvailabilityZone": { + "Fn::Select": [ + 1, + { + "Fn::GetAZs": "" + } + ] + }, + "CidrBlock": "10.0.192.0/18", + "MapPublicIpOnLaunch": false, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "Private" + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Private" + }, + { + "Key": "Name", + "Value": "aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet2" + } + ], + "VpcId": { + "Ref": "EcsClusterVpc779914AB" + } + } + }, + "EcsClusterVpcPrivateSubnet2RouteTable1D430E45": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet2" + } + ], + "VpcId": { + "Ref": "EcsClusterVpc779914AB" + } + } + }, + "EcsClusterVpcPrivateSubnet2RouteTableAssociation329A2412": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "EcsClusterVpcPrivateSubnet2RouteTable1D430E45" + }, + "SubnetId": { + "Ref": "EcsClusterVpcPrivateSubnet2SubnetC2B7B1BA" + } + } + }, + "EcsClusterVpcPrivateSubnet2DefaultRoute27221D27": { + "Type": "AWS::EC2::Route", + "Properties": { + "DestinationCidrBlock": "0.0.0.0/0", + "NatGatewayId": { + "Ref": "EcsClusterVpcPublicSubnet2NATGatewayBD015416" + }, + "RouteTableId": { + "Ref": "EcsClusterVpcPrivateSubnet2RouteTable1D430E45" + } + } + }, + "EcsClusterVpcIGW3663B083": { + "Type": "AWS::EC2::InternetGateway", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc" + } + ] + } + }, + "EcsClusterVpcVPCGW944296C0": { + "Type": "AWS::EC2::VPCGatewayAttachment", + "Properties": { + "InternetGatewayId": { + "Ref": "EcsClusterVpcIGW3663B083" + }, + "VpcId": { + "Ref": "EcsClusterVpc779914AB" + } + } + }, + "EcsClusterVpcRestrictDefaultSecurityGroupCustomResource8F588911": { + "Type": "Custom::VpcRestrictDefaultSG", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E", + "Arn" + ] + }, + "DefaultSecurityGroupId": { + "Fn::GetAtt": [ + "EcsClusterVpc779914AB", + "DefaultSecurityGroup" + ] + }, + "Account": { + "Ref": "AWS::AccountId" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ] + }, + "ManagedPolicyArns": [ + { + "Fn::Sub": "arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + } + ], + "Policies": [ + { + "PolicyName": "Inline", + "PolicyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "ec2:AuthorizeSecurityGroupIngress", + "ec2:AuthorizeSecurityGroupEgress", + "ec2:RevokeSecurityGroupIngress", + "ec2:RevokeSecurityGroupEgress" + ], + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":ec2:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":security-group/", + { + "Fn::GetAtt": [ + "EcsClusterVpc779914AB", + "DefaultSecurityGroup" + ] + } + ] + ] + } + ] + } + ] + } + } + ] + } + }, + "CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "a1acfc2b5f4f6b183fd2bb9863f486bc5edef6a357b355a070d9a0e502df418c.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0", + "Arn" + ] + }, + "Runtime": { + "Fn::FindInMap": [ + "LatestNodeRuntimeMap", + { + "Ref": "AWS::Region" + }, + "value" + ] + }, + "Description": "Lambda function for removing all inbound/outbound rules from the VPC default security group" + }, + "DependsOn": [ + "CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0" + ] + }, + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRole924E9B5D": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "ecs-tasks.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRoleDefaultPolicy992E1F4A": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "sqs:ChangeMessageVisibility", + "sqs:DeleteMessage", + "sqs:GetQueueAttributes", + "sqs:GetQueueUrl", + "sqs:ReceiveMessage" + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "CdkAppQueueFB2A6F8C", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRoleDefaultPolicy992E1F4A", + "Roles": [ + { + "Ref": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRole924E9B5D" + } + ] + } + }, + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDef60168D59": { + "Type": "AWS::ECS::TaskDefinition", + "Properties": { + "ContainerDefinitions": [ + { + "Environment": [ + { + "Name": "QUEUE_NAME", + "Value": { + "Fn::GetAtt": [ + "CdkAppQueueFB2A6F8C", + "QueueName" + ] + } + } + ], + "Essential": true, + "Image": { + "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:205c5d917605ee59cc93dc29526bc4f73b315ae613cdfbc52b8179f388041a03" + }, + "LogConfiguration": { + "LogDriver": "awslogs", + "Options": { + "awslogs-group": { + "Ref": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefQueueProcessingContainerLogGroup17540BDB" + }, + "awslogs-stream-prefix": "backlogPerInstanceQueueProcessingFargateServiceTest", + "awslogs-region": { + "Ref": "AWS::Region" + } + } + }, + "Name": "QueueProcessingContainer" + } + ], + "Cpu": "256", + "ExecutionRoleArn": { + "Fn::GetAtt": [ + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefExecutionRole15D95A8A", + "Arn" + ] + }, + "Family": "awsecspatternsqueuebacklogperinstancescalingbacklogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefFECF6862", + "Memory": "512", + "NetworkMode": "awsvpc", + "RequiresCompatibilities": [ + "FARGATE" + ], + "TaskRoleArn": { + "Fn::GetAtt": [ + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRole924E9B5D", + "Arn" + ] + } + } + }, + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefQueueProcessingContainerLogGroup17540BDB": { + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefExecutionRole15D95A8A": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "ecs-tasks.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefExecutionRoleDefaultPolicy602765AC": { + "Type": "AWS::IAM::Policy", + "Properties": { + "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": [ + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefQueueProcessingContainerLogGroup17540BDB", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefExecutionRoleDefaultPolicy602765AC", + "Roles": [ + { + "Ref": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefExecutionRole15D95A8A" + } + ] + } + }, + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateService561006C6": { + "Type": "AWS::ECS::Service", + "Properties": { + "Cluster": { + "Ref": "EcsCluster97242B84" + }, + "DeploymentConfiguration": { + "MaximumPercent": 200, + "MinimumHealthyPercent": 50 + }, + "EnableECSManagedTags": false, + "LaunchType": "FARGATE", + "NetworkConfiguration": { + "AwsvpcConfiguration": { + "AssignPublicIp": "DISABLED", + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateServiceSecurityGroup98225034", + "GroupId" + ] + } + ], + "Subnets": [ + { + "Ref": "EcsClusterVpcPrivateSubnet1SubnetFAB0E487" + }, + { + "Ref": "EcsClusterVpcPrivateSubnet2SubnetC2B7B1BA" + } + ] + } + }, + "TaskDefinition": { + "Ref": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDef60168D59" + } + }, + "DependsOn": [ + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRoleDefaultPolicy992E1F4A", + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRole924E9B5D" + ] + }, + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateServiceSecurityGroup98225034": { + "Type": "AWS::EC2::SecurityGroup", + "Properties": { + "GroupDescription": "aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/SecurityGroup", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1" + } + ], + "VpcId": { + "Ref": "EcsClusterVpc779914AB" + } + }, + "DependsOn": [ + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRoleDefaultPolicy992E1F4A", + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRole924E9B5D" + ] + }, + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateServiceTaskCountTarget5F708D31": { + "Type": "AWS::ApplicationAutoScaling::ScalableTarget", + "Properties": { + "MaxCapacity": 2, + "MinCapacity": 0, + "ResourceId": { + "Fn::Join": [ + "", + [ + "service/", + { + "Ref": "EcsCluster97242B84" + }, + "/", + { + "Fn::GetAtt": [ + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateService561006C6", + "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" + }, + "DependsOn": [ + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRoleDefaultPolicy992E1F4A", + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRole924E9B5D" + ] + }, + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateServiceTaskCountTargetBacklogPerInstanceScaling5D6AFAA1": { + "Type": "AWS::ApplicationAutoScaling::ScalingPolicy", + "Properties": { + "PolicyName": "awsecspatternsqueuebacklogperinstancescalingbacklogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateServiceTaskCountTargetBacklogPerInstanceScaling2A5AC6FE", + "PolicyType": "TargetTrackingScaling", + "ScalingTargetId": { + "Ref": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateServiceTaskCountTarget5F708D31" + }, + "TargetTrackingScalingPolicyConfiguration": { + "CustomizedMetricSpecification": { + "Metrics": [ + { + "Id": "m1", + "MetricStat": { + "Metric": { + "Dimensions": [ + { + "Name": "QueueName", + "Value": { + "Fn::GetAtt": [ + "CdkAppQueueFB2A6F8C", + "QueueName" + ] + } + } + ], + "MetricName": "ApproximateNumberOfMessagesVisible", + "Namespace": "AWS/SQS" + }, + "Stat": "Sum" + }, + "ReturnData": false + }, + { + "Id": "m2", + "MetricStat": { + "Metric": { + "Dimensions": [ + { + "Name": "ClusterName", + "Value": { + "Ref": "EcsCluster97242B84" + } + }, + { + "Name": "ServiceName", + "Value": { + "Fn::GetAtt": [ + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateService561006C6", + "Name" + ] + } + } + ], + "MetricName": "RunningTaskCount", + "Namespace": "ECS/ContainerInsights" + }, + "Stat": "Average" + }, + "ReturnData": false + }, + { + "Expression": "m1 / m2", + "Id": "expression", + "ReturnData": true + } + ] + }, + "TargetValue": 100 + } + }, + "DependsOn": [ + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRoleDefaultPolicy992E1F4A", + "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRole924E9B5D" + ] + } + }, + "Mappings": { + "LatestNodeRuntimeMap": { + "af-south-1": { + "value": "nodejs20.x" + }, + "ap-east-1": { + "value": "nodejs20.x" + }, + "ap-northeast-1": { + "value": "nodejs20.x" + }, + "ap-northeast-2": { + "value": "nodejs20.x" + }, + "ap-northeast-3": { + "value": "nodejs20.x" + }, + "ap-south-1": { + "value": "nodejs20.x" + }, + "ap-south-2": { + "value": "nodejs20.x" + }, + "ap-southeast-1": { + "value": "nodejs20.x" + }, + "ap-southeast-2": { + "value": "nodejs20.x" + }, + "ap-southeast-3": { + "value": "nodejs20.x" + }, + "ap-southeast-4": { + "value": "nodejs20.x" + }, + "ap-southeast-5": { + "value": "nodejs20.x" + }, + "ap-southeast-7": { + "value": "nodejs20.x" + }, + "ca-central-1": { + "value": "nodejs20.x" + }, + "ca-west-1": { + "value": "nodejs20.x" + }, + "cn-north-1": { + "value": "nodejs20.x" + }, + "cn-northwest-1": { + "value": "nodejs20.x" + }, + "eu-central-1": { + "value": "nodejs20.x" + }, + "eu-central-2": { + "value": "nodejs20.x" + }, + "eu-isoe-west-1": { + "value": "nodejs18.x" + }, + "eu-north-1": { + "value": "nodejs20.x" + }, + "eu-south-1": { + "value": "nodejs20.x" + }, + "eu-south-2": { + "value": "nodejs20.x" + }, + "eu-west-1": { + "value": "nodejs20.x" + }, + "eu-west-2": { + "value": "nodejs20.x" + }, + "eu-west-3": { + "value": "nodejs20.x" + }, + "il-central-1": { + "value": "nodejs20.x" + }, + "me-central-1": { + "value": "nodejs20.x" + }, + "me-south-1": { + "value": "nodejs20.x" + }, + "mx-central-1": { + "value": "nodejs20.x" + }, + "sa-east-1": { + "value": "nodejs20.x" + }, + "us-east-1": { + "value": "nodejs20.x" + }, + "us-east-2": { + "value": "nodejs20.x" + }, + "us-gov-east-1": { + "value": "nodejs20.x" + }, + "us-gov-west-1": { + "value": "nodejs20.x" + }, + "us-iso-east-1": { + "value": "nodejs18.x" + }, + "us-iso-west-1": { + "value": "nodejs18.x" + }, + "us-isob-east-1": { + "value": "nodejs18.x" + }, + "us-west-1": { + "value": "nodejs20.x" + }, + "us-west-2": { + "value": "nodejs20.x" + } + } + }, + "Outputs": { + "backlogPerInstanceQueueProcessingFargateServiceTestSQSQueue3EA51BAD": { + "Value": { + "Fn::GetAtt": [ + "CdkAppQueueFB2A6F8C", + "QueueName" + ] + } + }, + "backlogPerInstanceQueueProcessingFargateServiceTestSQSQueueArn97B53CD1": { + "Value": { + "Fn::GetAtt": [ + "CdkAppQueueFB2A6F8C", + "Arn" + ] + } + } + }, + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/cdk.out new file mode 100644 index 0000000000000..188478b55560e --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/cdk.out @@ -0,0 +1 @@ +{"version":"41.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-backlog-per-instance-scaling.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/integ.json new file mode 100644 index 0000000000000..3293ccb59e35b --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/integ.json @@ -0,0 +1,12 @@ +{ + "version": "41.0.0", + "testCases": { + "queueProcessingFargateServiceTest/DefaultTest": { + "stacks": [ + "aws-ecs-patterns-queue-backlog-per-instance-scaling" + ], + "assertionStack": "queueProcessingFargateServiceTest/DefaultTest/DeployAssert", + "assertionStackName": "queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6" + } + } +} \ 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-backlog-per-instance-scaling.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/manifest.json new file mode 100644 index 0000000000000..9ac682400b649 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/manifest.json @@ -0,0 +1,1007 @@ +{ + "version": "42.0.0", + "artifacts": { + "aws-ecs-patterns-queue-backlog-per-instance-scaling.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "aws-ecs-patterns-queue-backlog-per-instance-scaling.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "aws-ecs-patterns-queue-backlog-per-instance-scaling": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "aws-ecs-patterns-queue-backlog-per-instance-scaling.template.json", + "terminationProtection": false, + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/9e39fe8a08325ec3ac063b342a98976a5b0337c371d7fcbf6567aac21b95a95d.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "aws-ecs-patterns-queue-backlog-per-instance-scaling.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "aws-ecs-patterns-queue-backlog-per-instance-scaling.assets" + ], + "metadata": { + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/CdkAppQueue": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/CdkAppQueue/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "CdkAppQueueFB2A6F8C" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "containerInsightsV2": "enabled" + } + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsCluster97242B84" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "maxAzs": "*" + } + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpc779914AB" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/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-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1/Subnet": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPublicSubnet1Subnet4AC37B0F" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1/RouteTable": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPublicSubnet1RouteTable4AE3113D" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1/RouteTableAssociation": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPublicSubnet1RouteTableAssociation49C4CDBB" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1/DefaultRoute": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPublicSubnet1DefaultRoute8C7EFC96" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1/EIP": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPublicSubnet1EIP2D3759A3" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1/NATGateway": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPublicSubnet1NATGateway2F1E7764" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/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-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2/Subnet": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPublicSubnet2Subnet4A959A4C" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2/RouteTable": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPublicSubnet2RouteTable89A2F6C5" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2/RouteTableAssociation": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPublicSubnet2RouteTableAssociationE4D42FC1" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2/DefaultRoute": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPublicSubnet2DefaultRoute048730F7" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2/EIP": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPublicSubnet2EIP26E3EEEF" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2/NATGateway": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPublicSubnet2NATGatewayBD015416" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/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-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet1/Subnet": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPrivateSubnet1SubnetFAB0E487" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet1/RouteTable": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPrivateSubnet1RouteTable2EA148EE" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet1/RouteTableAssociation": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPrivateSubnet1RouteTableAssociationF4E8ACD7" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet1/DefaultRoute": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPrivateSubnet1DefaultRoute0239F5D0" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/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-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet2/Subnet": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPrivateSubnet2SubnetC2B7B1BA" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet2/RouteTable": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPrivateSubnet2RouteTable1D430E45" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet2/RouteTableAssociation": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPrivateSubnet2RouteTableAssociation329A2412" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet2/DefaultRoute": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcPrivateSubnet2DefaultRoute27221D27" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/IGW": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcIGW3663B083" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/VPCGW": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcVPCGW944296C0" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/RestrictDefaultSecurityGroupCustomResource": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/RestrictDefaultSecurityGroupCustomResource/Default": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsClusterVpcRestrictDefaultSecurityGroupCustomResource8F588911" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/LatestNodeRuntimeMap": [ + { + "type": "aws:cdk:logicalId", + "data": "LatestNodeRuntimeMap" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/Custom::VpcRestrictDefaultSGCustomResourceProvider": [ + { + "type": "aws:cdk:is-custom-resource-handler-customResourceProvider", + "data": true + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role": [ + { + "type": "aws:cdk:logicalId", + "data": "CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler": [ + { + "type": "aws:cdk:logicalId", + "data": "CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/SQSQueue": [ + { + "type": "aws:cdk:logicalId", + "data": "backlogPerInstanceQueueProcessingFargateServiceTestSQSQueue3EA51BAD" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/SQSQueueArn": [ + { + "type": "aws:cdk:logicalId", + "data": "backlogPerInstanceQueueProcessingFargateServiceTestSQSQueueArn97B53CD1" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/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-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/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-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/TaskRole/ImportTaskRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/TaskRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRole924E9B5D" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/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-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/TaskRole/DefaultPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRoleDefaultPolicy992E1F4A" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDef60168D59", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_REPLACE" + ] + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "retention": "*" + } + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefQueueProcessingContainerLogGroup17540BDB" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/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-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/ExecutionRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefExecutionRole15D95A8A" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/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-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefExecutionRoleDefaultPolicy602765AC" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/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-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/Service": [ + { + "type": "aws:cdk:logicalId", + "data": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateService561006C6", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_REPLACE" + ] + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/SecurityGroup": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "vpc": "*" + } + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/SecurityGroup/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateServiceSecurityGroup98225034", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_REPLACE" + ] + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/ScalingRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/TaskCount/Target": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "serviceNamespace": "ecs", + "scalableDimension": "*", + "resourceId": "*", + "role": "*", + "minCapacity": "*", + "maxCapacity": "*" + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "scaleToTrackMetric": [ + "*", + { + "customMetric": { + "warnings": "*", + "warningsV2": "*" + }, + "targetValue": "*", + "policyName": "*", + "disableScaleIn": "*", + "scaleInCooldown": "*" + } + ] + } + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/TaskCount/Target/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateServiceTaskCountTarget5F708D31", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_REPLACE" + ] + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/TaskCount/Target/BacklogPerInstanceScaling/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateServiceTaskCountTargetBacklogPerInstanceScaling5D6AFAA1", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_REPLACE" + ] + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/aws-ecs-patterns-queue-backlog-per-instance-scaling/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ], + "VPCB9E5F0B4": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCB9E5F0B4", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPublicSubnet1SubnetB4246D30": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet1SubnetB4246D30", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPublicSubnet1RouteTableFEE4B781": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet1RouteTableFEE4B781", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPublicSubnet1RouteTableAssociation0B0896DC": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet1RouteTableAssociation0B0896DC", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPublicSubnet1DefaultRoute91CEF279": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet1DefaultRoute91CEF279", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPublicSubnet1EIP6AD938E8": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet1EIP6AD938E8", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPublicSubnet1NATGatewayE0556630": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet1NATGatewayE0556630", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPublicSubnet2Subnet74179F39": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet2Subnet74179F39", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPublicSubnet2RouteTable6F1A15F1": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet2RouteTable6F1A15F1", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPublicSubnet2RouteTableAssociation5A808732": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet2RouteTableAssociation5A808732", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPublicSubnet2DefaultRouteB7481BBA": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet2DefaultRouteB7481BBA", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPublicSubnet2EIP4947BC00": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet2EIP4947BC00", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPublicSubnet2NATGateway3C070193": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPublicSubnet2NATGateway3C070193", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPrivateSubnet1Subnet8BCA10E0": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet1Subnet8BCA10E0", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPrivateSubnet1RouteTableBE8A6027": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet1RouteTableBE8A6027", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPrivateSubnet1RouteTableAssociation347902D1": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet1RouteTableAssociation347902D1", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPrivateSubnet1DefaultRouteAE1D6490": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet1DefaultRouteAE1D6490", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPrivateSubnet2SubnetCFCDAA7A": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet2SubnetCFCDAA7A", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPrivateSubnet2RouteTable0A19E10E": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet2RouteTable0A19E10E", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPrivateSubnet2RouteTableAssociation0C73D413": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet2RouteTableAssociation0C73D413", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCPrivateSubnet2DefaultRouteF4F5CFD2": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCPrivateSubnet2DefaultRouteF4F5CFD2", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCIGWB7E252D3": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCIGWB7E252D3", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "VPCVPCGW99B986DC": [ + { + "type": "aws:cdk:logicalId", + "data": "VPCVPCGW99B986DC", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3": [ + { + "type": "aws:cdk:logicalId", + "data": "EcsDefaultClusterMnL3mNNYNVPC9C1EC7A3", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ] + }, + "displayName": "aws-ecs-patterns-queue-backlog-per-instance-scaling" + }, + "queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.template.json", + "terminationProtection": false, + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.assets" + ], + "metadata": { + "/queueProcessingFargateServiceTest/DefaultTest/DeployAssert/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/queueProcessingFargateServiceTest/DefaultTest/DeployAssert/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "queueProcessingFargateServiceTest/DefaultTest/DeployAssert" + }, + "Tree": { + "type": "cdk:tree", + "properties": { + "file": "tree.json" + } + } + }, + "minimumCliVersion": "2.1008.0" +} diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.assets.json new file mode 100644 index 0000000000000..1e17d5fedb014 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.assets.json @@ -0,0 +1,20 @@ +{ + "version": "41.0.0", + "files": { + "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { + "displayName": "queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6 Template", + "source": { + "path": "queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.template.json new file mode 100644 index 0000000000000..ad9d0fb73d1dd --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/queueProcessingFargateServiceTestDefaultTestDeployAssert73AFD2F6.template.json @@ -0,0 +1,36 @@ +{ + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/tree.json new file mode 100644 index 0000000000000..11f55c6fd2a64 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.js.snapshot/tree.json @@ -0,0 +1 @@ +{"version":"tree-0.1","tree":{"id":"App","path":"","children":{"aws-ecs-patterns-queue-backlog-per-instance-scaling":{"id":"aws-ecs-patterns-queue-backlog-per-instance-scaling","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling","children":{"CdkAppQueue":{"id":"CdkAppQueue","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/CdkAppQueue","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/CdkAppQueue/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"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_sqs.Queue","version":"0.0.0","metadata":["*"]}},"EcsCluster":{"id":"EcsCluster","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::Cluster","aws:cdk:cloudformation:props":{"clusterSettings":[{"name":"containerInsights","value":"enabled"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnCluster","version":"0.0.0"}},"Vpc":{"id":"Vpc","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/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-backlog-per-instance-scaling/EcsCluster/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPC","version":"0.0.0"}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/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-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"EcsClusterVpc779914AB"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1/RouteTable","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1"}],"vpcId":{"Ref":"EcsClusterVpc779914AB"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1/RouteTableAssociation","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"EcsClusterVpcPublicSubnet1RouteTable4AE3113D"},"subnetId":{"Ref":"EcsClusterVpcPublicSubnet1Subnet4AC37B0F"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1/DefaultRoute","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","gatewayId":{"Ref":"EcsClusterVpcIGW3663B083"},"routeTableId":{"Ref":"EcsClusterVpcPublicSubnet1RouteTable4AE3113D"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"}},"EIP":{"id":"EIP","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/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-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet1/NATGateway","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::NatGateway","aws:cdk:cloudformation:props":{"allocationId":{"Fn::GetAtt":["EcsClusterVpcPublicSubnet1EIP2D3759A3","AllocationId"]},"subnetId":{"Ref":"EcsClusterVpcPublicSubnet1Subnet4AC37B0F"},"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/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-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/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-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"EcsClusterVpc779914AB"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2/RouteTable","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2"}],"vpcId":{"Ref":"EcsClusterVpc779914AB"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2/RouteTableAssociation","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"EcsClusterVpcPublicSubnet2RouteTable89A2F6C5"},"subnetId":{"Ref":"EcsClusterVpcPublicSubnet2Subnet4A959A4C"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2/DefaultRoute","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","gatewayId":{"Ref":"EcsClusterVpcIGW3663B083"},"routeTableId":{"Ref":"EcsClusterVpcPublicSubnet2RouteTable89A2F6C5"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"}},"EIP":{"id":"EIP","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/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-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"}},"NATGateway":{"id":"NATGateway","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PublicSubnet2/NATGateway","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::NatGateway","aws:cdk:cloudformation:props":{"allocationId":{"Fn::GetAtt":["EcsClusterVpcPublicSubnet2EIP26E3EEEF","AllocationId"]},"subnetId":{"Ref":"EcsClusterVpcPublicSubnet2Subnet4A959A4C"},"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/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-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet1","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/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-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"EcsClusterVpc779914AB"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet1/RouteTable","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet1"}],"vpcId":{"Ref":"EcsClusterVpc779914AB"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet1/RouteTableAssociation","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"EcsClusterVpcPrivateSubnet1RouteTable2EA148EE"},"subnetId":{"Ref":"EcsClusterVpcPrivateSubnet1SubnetFAB0E487"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet1/DefaultRoute","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","natGatewayId":{"Ref":"EcsClusterVpcPublicSubnet1NATGateway2F1E7764"},"routeTableId":{"Ref":"EcsClusterVpcPrivateSubnet1RouteTable2EA148EE"}}},"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-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet2","children":{"Subnet":{"id":"Subnet","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/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-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"EcsClusterVpc779914AB"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"}},"Acl":{"id":"Acl","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet2/RouteTable","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet2"}],"vpcId":{"Ref":"EcsClusterVpc779914AB"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet2/RouteTableAssociation","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"EcsClusterVpcPrivateSubnet2RouteTable1D430E45"},"subnetId":{"Ref":"EcsClusterVpcPrivateSubnet2SubnetC2B7B1BA"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/PrivateSubnet2/DefaultRoute","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","natGatewayId":{"Ref":"EcsClusterVpcPublicSubnet2NATGatewayBD015416"},"routeTableId":{"Ref":"EcsClusterVpcPrivateSubnet2RouteTable1D430E45"}}},"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-backlog-per-instance-scaling/EcsCluster/Vpc/IGW","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::InternetGateway","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc"}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnInternetGateway","version":"0.0.0"}},"VPCGW":{"id":"VPCGW","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/VPCGW","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPCGatewayAttachment","aws:cdk:cloudformation:props":{"internetGatewayId":{"Ref":"EcsClusterVpcIGW3663B083"},"vpcId":{"Ref":"EcsClusterVpc779914AB"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment","version":"0.0.0"}},"RestrictDefaultSecurityGroupCustomResource":{"id":"RestrictDefaultSecurityGroupCustomResource","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/Vpc/RestrictDefaultSecurityGroupCustomResource","children":{"Default":{"id":"Default","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/EcsCluster/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":"*"}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.Cluster","version":"0.0.0","metadata":[{"containerInsightsV2":"enabled"}]}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","version":"0.0.0"}},"Custom::VpcRestrictDefaultSGCustomResourceProvider":{"id":"Custom::VpcRestrictDefaultSGCustomResourceProvider","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/Custom::VpcRestrictDefaultSGCustomResourceProvider","children":{"Staging":{"id":"Staging","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/Custom::VpcRestrictDefaultSGCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"}},"backlogPerInstanceQueueProcessingFargateServiceTest":{"id":"backlogPerInstanceQueueProcessingFargateServiceTest","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest","children":{"SQSQueue":{"id":"SQSQueue","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/SQSQueue","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"SQSQueueArn":{"id":"SQSQueueArn","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/SQSQueueArn","constructInfo":{"fqn":"aws-cdk-lib.CfnOutput","version":"0.0.0"}},"QueueProcessingTaskDef":{"id":"QueueProcessingTaskDef","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef","children":{"TaskRole":{"id":"TaskRole","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/TaskRole","children":{"ImportTaskRole":{"id":"ImportTaskRole","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/TaskRole/ImportTaskRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/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-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/TaskRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/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":["CdkAppQueueFB2A6F8C","Arn"]}}],"Version":"2012-10-17"},"policyName":"backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRoleDefaultPolicy992E1F4A","roles":[{"Ref":"backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRole924E9B5D"}]}},"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-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/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":"backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefQueueProcessingContainerLogGroup17540BDB"},"awslogs-stream-prefix":"backlogPerInstanceQueueProcessingFargateServiceTest","awslogs-region":{"Ref":"AWS::Region"}}},"environment":[{"name":"QUEUE_NAME","value":{"Fn::GetAtt":["CdkAppQueueFB2A6F8C","QueueName"]}}]}],"cpu":"256","executionRoleArn":{"Fn::GetAtt":["backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefExecutionRole15D95A8A","Arn"]},"family":"awsecspatternsqueuebacklogperinstancescalingbacklogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefFECF6862","memory":"512","networkMode":"awsvpc","requiresCompatibilities":["FARGATE"],"taskRoleArn":{"Fn::GetAtt":["backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefTaskRole924E9B5D","Arn"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnTaskDefinition","version":"0.0.0"}},"QueueProcessingContainer":{"id":"QueueProcessingContainer","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/QueueProcessingContainer","children":{"AssetImage":{"id":"AssetImage","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage","children":{"Staging":{"id":"Staging","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/QueueProcessingContainer/AssetImage/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Repository":{"id":"Repository","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/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-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/QueueProcessingContainer/LogGroup","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/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-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/ExecutionRole","children":{"ImportExecutionRole":{"id":"ImportExecutionRole","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/ExecutionRole/ImportExecutionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/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-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingTaskDef/ExecutionRole/DefaultPolicy","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/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":["backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefQueueProcessingContainerLogGroup17540BDB","Arn"]}}],"Version":"2012-10-17"},"policyName":"backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefExecutionRoleDefaultPolicy602765AC","roles":[{"Ref":"backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDefExecutionRole15D95A8A"}]}},"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-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService","children":{"Service":{"id":"Service","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/Service","attributes":{"aws:cdk:cloudformation:type":"AWS::ECS::Service","aws:cdk:cloudformation:props":{"cluster":{"Ref":"EcsCluster97242B84"},"deploymentConfiguration":{"maximumPercent":200,"minimumHealthyPercent":50},"enableEcsManagedTags":false,"launchType":"FARGATE","networkConfiguration":{"awsvpcConfiguration":{"assignPublicIp":"DISABLED","subnets":[{"Ref":"EcsClusterVpcPrivateSubnet1SubnetFAB0E487"},{"Ref":"EcsClusterVpcPrivateSubnet2SubnetC2B7B1BA"}],"securityGroups":[{"Fn::GetAtt":["backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateServiceSecurityGroup98225034","GroupId"]}]}},"taskDefinition":{"Ref":"backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingTaskDef60168D59"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_ecs.CfnService","version":"0.0.0"}},"SecurityGroup":{"id":"SecurityGroup","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/SecurityGroup","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/SecurityGroup/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroup","aws:cdk:cloudformation:props":{"groupDescription":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"EcsClusterVpc779914AB"}}},"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-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/ScalingRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"TaskCount":{"id":"TaskCount","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/TaskCount","children":{"Target":{"id":"Target","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/TaskCount/Target","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/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":"EcsCluster97242B84"},"/",{"Fn::GetAtt":["backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateService561006C6","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"}},"BacklogPerInstanceScaling":{"id":"BacklogPerInstanceScaling","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/TaskCount/Target/BacklogPerInstanceScaling","children":{"Resource":{"id":"Resource","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/backlogPerInstanceQueueProcessingFargateServiceTest/QueueProcessingFargateService/TaskCount/Target/BacklogPerInstanceScaling/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::ApplicationAutoScaling::ScalingPolicy","aws:cdk:cloudformation:props":{"policyName":"awsecspatternsqueuebacklogperinstancescalingbacklogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateServiceTaskCountTargetBacklogPerInstanceScaling2A5AC6FE","policyType":"TargetTrackingScaling","scalingTargetId":{"Ref":"backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateServiceTaskCountTarget5F708D31"},"targetTrackingScalingPolicyConfiguration":{"customizedMetricSpecification":{"metrics":[{"id":"m1","metricStat":{"metric":{"dimensions":[{"name":"QueueName","value":{"Fn::GetAtt":["CdkAppQueueFB2A6F8C","QueueName"]}}],"metricName":"ApproximateNumberOfMessagesVisible","namespace":"AWS/SQS"},"stat":"Sum"},"returnData":false},{"id":"m2","metricStat":{"metric":{"dimensions":[{"name":"ClusterName","value":{"Ref":"EcsCluster97242B84"}},{"name":"ServiceName","value":{"Fn::GetAtt":["backlogPerInstanceQueueProcessingFargateServiceTestQueueProcessingFargateService561006C6","Name"]}}],"metricName":"RunningTaskCount","namespace":"ECS/ContainerInsights"},"stat":"Average"},"returnData":false},{"id":"expression","expression":"m1 / m2","returnData":true}]},"targetValue":100}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.CfnScalingPolicy","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_applicationautoscaling.TargetTrackingScalingPolicy","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":["*",{"customMetric":{"warnings":"*","warningsV2":"*"},"targetValue":"*","policyName":"*","disableScaleIn":"*","scaleInCooldown":"*"}]}]}}},"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"}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-ecs-patterns-queue-backlog-per-instance-scaling/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.4.2"}},"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.4.2"}}},"constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.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-backlog-per-instance-scaling.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.ts new file mode 100644 index 0000000000000..5538a6a7540a5 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-ecs-patterns/test/fargate/integ.queue-processing-fargate-service-backlog-per-instance-scaling.ts @@ -0,0 +1,31 @@ +import * as path from 'path'; +import { Cluster, AssetImage, ContainerInsights } from 'aws-cdk-lib/aws-ecs'; +import { App, Stack } from 'aws-cdk-lib'; +import * as integ from '@aws-cdk/integ-tests-alpha'; +import { QueueProcessingFargateService } from 'aws-cdk-lib/aws-ecs-patterns'; +import { Queue } from 'aws-cdk-lib/aws-sqs'; + +const app = new App(); +const stack = new Stack(app, 'aws-ecs-patterns-queue-backlog-per-instance-scaling'); + +const queue = new Queue(stack, 'CdkAppQueue', { +}); + +const cluster = new Cluster(stack, 'EcsCluster', { containerInsightsV2: ContainerInsights.ENABLED }); + +new QueueProcessingFargateService(stack, 'backlogPerInstanceQueueProcessingFargateServiceTest', { + cluster, + memoryLimitMiB: 512, + image: new AssetImage(path.join(__dirname, '..', 'sqs-reader')), + minScalingCapacity: 0, + queue, + enableBacklogPerInstanceBasedScaling: true, + backlogPerInstanceTargetValue: 100, + disableCpuBasedScaling: true, +}); + +new integ.IntegTest(app, 'queueProcessingFargateServiceTest', { + testCases: [stack], +}); + +app.synth(); diff --git a/packages/aws-cdk-lib/aws-applicationautoscaling/lib/target-tracking-scaling-policy.ts b/packages/aws-cdk-lib/aws-applicationautoscaling/lib/target-tracking-scaling-policy.ts index 4491167b620bc..3d54ae17b10d9 100644 --- a/packages/aws-cdk-lib/aws-applicationautoscaling/lib/target-tracking-scaling-policy.ts +++ b/packages/aws-cdk-lib/aws-applicationautoscaling/lib/target-tracking-scaling-policy.ts @@ -127,10 +127,6 @@ export class TargetTrackingScalingPolicy extends Construct { throw new ValidationError('Exactly one of \'customMetric\' or \'predefinedMetric\' must be specified.', scope); } - if (props.customMetric && !props.customMetric.toMetricConfig().metricStat) { - throw new ValidationError('Only direct metrics are supported for Target Tracking. Use Step Scaling or supply a Metric object.', scope); - } - super(scope, id); // replace dummy value in DYNAMODB_WRITE_CAPACITY_UTILIZATION due to a jsii bug (https://github.com/aws/jsii/issues/2782) @@ -159,21 +155,77 @@ export class TargetTrackingScalingPolicy extends Construct { } } +function validateMetricStatistic(scope: Construct, metricStatistic: cloudwatch.MetricStatConfig) { + const statistic = metricStatistic.statistic.toLowerCase(); + if (statistic.startsWith('p')) { + throw new ValidationError(`Cannot use statistic '${statistic}' for Target Tracking: only 'Average', 'Minimum', 'Maximum', 'SampleCount', and 'Sum' are supported.`, scope); + } +} + function renderCustomMetric(scope: Construct, metric?: cloudwatch.IMetric): CfnScalingPolicy.CustomizedMetricSpecificationProperty | undefined { if (!metric) { return undefined; } - const c = metric.toMetricConfig().metricStat!; - if (c.statistic.startsWith('p')) { - throw new ValidationError(`Cannot use statistic '${c.statistic}' for Target Tracking: only 'Average', 'Minimum', 'Maximum', 'SampleCount', and 'Sum' are supported.`, scope); - } + let metricConfig = metric.toMetricConfig(); + + if ('metricStat' in metricConfig) { + const metricStat = metricConfig.metricStat!; + + validateMetricStatistic(scope, metricStat); + return { + dimensions: metricStat.dimensions, + metricName: metricStat.metricName, + namespace: metricStat.namespace, + statistic: metricStat.statistic, + unit: metricStat.unitFilter, + }; + } else if ('mathExpression' in metricConfig) { + const mathExpression = metricConfig.mathExpression!; - return { - dimensions: c.dimensions, - metricName: c.metricName, - namespace: c.namespace, - statistic: c.statistic, - unit: c.unitFilter, - }; + for (const mathExpressionMetric of Object.values(mathExpression.usingMetrics)) { + const mathExpressionMetricConfig = mathExpressionMetric.toMetricConfig(); + if ('mathExpression' in mathExpressionMetricConfig) { + throw new ValidationError('Nested math expressions are not supported', scope); + } + } + + const metrics: CfnScalingPolicy.TargetTrackingMetricDataQueryProperty[] = []; + + Object.entries(mathExpression.usingMetrics).forEach(([id, mathExpressionMetric]) => { + const mathExpressionMetricConfig = mathExpressionMetric.toMetricConfig(); + if ('metricStat' in mathExpressionMetricConfig) { + const metricStat = mathExpressionMetricConfig.metricStat!; + validateMetricStatistic(scope, metricStat); + metrics.push({ + id, + metricStat: { + metric: { + dimensions: metricStat.dimensions, + metricName: metricStat.metricName, + namespace: metricStat.namespace, + }, + stat: metricStat.statistic, + unit: metricStat.unitFilter, + }, + returnData: false, + }); + } else { + throw new ValidationError('For custom metrics using math expression, only Metric object supported', scope); + } + }); + + metrics.push({ + id: 'expression', + expression: mathExpression.expression, + label: metricConfig.renderingProperties?.label as string, + returnData: true, + }); + + return { + metrics, + }; + } else { + throw new ValidationError('Either MathExpression or Metric Object must be passed', scope); + } } /** diff --git a/packages/aws-cdk-lib/aws-applicationautoscaling/test/target-tracking.test.ts b/packages/aws-cdk-lib/aws-applicationautoscaling/test/target-tracking.test.ts index 17ea26b028c0f..3a30cacbf328a 100644 --- a/packages/aws-cdk-lib/aws-applicationautoscaling/test/target-tracking.test.ts +++ b/packages/aws-cdk-lib/aws-applicationautoscaling/test/target-tracking.test.ts @@ -174,4 +174,61 @@ describe('target tracking', () => { }); }); + + test('test setup target tracking on math expression', () => { + // GIVEN + const stack = new cdk.Stack(); + const target = createScalableTarget(stack); + + // WHEN + target.scaleToTrackMetric('Tracking', { + customMetric: new cloudwatch.MathExpression({ + label: 'expression', + expression: 'm1 + m2', + usingMetrics: { + m1: new cloudwatch.Metric({ namespace: 'Metric1', metricName: 'Metric1' }), + m2: new cloudwatch.Metric({ namespace: 'Metric2', metricName: 'Metric2' }), + }, + }), + targetValue: 100, + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::ApplicationAutoScaling::ScalingPolicy', { + PolicyType: 'TargetTrackingScaling', + TargetTrackingScalingPolicyConfiguration: { + TargetValue: 100, + CustomizedMetricSpecification: { + Metrics: [ + { + Id: 'm1', + MetricStat: { + Metric: { + MetricName: 'Metric1', + Namespace: 'Metric1', + }, + Stat: 'Average', + }, + }, + { + Id: 'm2', + MetricStat: { + Metric: { + MetricName: 'Metric2', + Namespace: 'Metric2', + }, + Stat: 'Average', + }, + }, + { + Expression: 'm1 + m2', + ReturnData: true, + Id: 'expression', + Label: 'expression', + }, + ], + }, + }, + }); + }); }); diff --git a/packages/aws-cdk-lib/aws-ecs-patterns/README.md b/packages/aws-cdk-lib/aws-ecs-patterns/README.md index 4b734f8408905..1de42219797ac 100644 --- a/packages/aws-cdk-lib/aws-ecs-patterns/README.md +++ b/packages/aws-cdk-lib/aws-ecs-patterns/README.md @@ -350,6 +350,32 @@ const queueProcessingFargateService = new ecsPatterns.QueueProcessingFargateServ }); ``` +To enable Backlog per instance scaling. See [Amazon SQS Backlog per instance](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-target-tracking-metric-math.html#metric-math-sqs-queue-backlog) + +To specify custom backlog per instance value, use the ```backlogPerInstanceTargetValue``` property. + +NOTE: The cluster should have Container Insights Enabled by setting ```containerInsightsV2``` to ```ContainerInsights.ENABLED``` + +```ts +const cluster = new ecs.Cluster(this, 'EcsCluster', { containerInsightsV2: ecs.ContainerInsights.ENABLED }); + +new ecsPatterns.QueueProcessingFargateService(this, 'Service', { + cluster, + memoryLimitMiB: 512, + image: ecs.ContainerImage.fromRegistry('test'), + command: ["-c", "4", "amazon.com"], + enableLogging: false, + desiredTaskCount: 2, + environment: {}, + maxScalingCapacity: 5, + containerName: 'test', + minHealthyPercent: 100, + enableBacklogPerInstanceBasedScaling: true, + backlogPerInstanceTargetValue: 100, + disableCpuBasedScaling: true, +}); +``` + ## Scheduled Tasks To define a task that runs periodically, there are 2 options: diff --git a/packages/aws-cdk-lib/aws-ecs-patterns/lib/base/queue-processing-service-base.ts b/packages/aws-cdk-lib/aws-ecs-patterns/lib/base/queue-processing-service-base.ts index d61567e55670e..6239dca124ea2 100644 --- a/packages/aws-cdk-lib/aws-ecs-patterns/lib/base/queue-processing-service-base.ts +++ b/packages/aws-cdk-lib/aws-ecs-patterns/lib/base/queue-processing-service-base.ts @@ -1,5 +1,6 @@ import { Construct } from 'constructs'; import { ScalingInterval } from '../../../aws-applicationautoscaling'; +import { MathExpression, Metric, Stats } from '../../../aws-cloudwatch'; import { IVpc } from '../../../aws-ec2'; import { AwsLogDriver, BaseService, CapacityProviderStrategy, Cluster, ContainerImage, DeploymentController, DeploymentCircuitBreaker, @@ -252,6 +253,18 @@ export interface QueueProcessingServiceBaseProps { * @default - 50 */ readonly cpuTargetUtilizationPercent?: number; + + /** + * Flag to enable Backlog per instance based scaling on the service. + * @default - false + */ + readonly enableBacklogPerInstanceBasedScaling?: boolean; + + /** + * The target Backlog per instance for Backlog per instance based scaling strategy when enabled. + * @default - 100 + */ + readonly backlogPerInstanceTargetValue?: number; } /** @@ -328,6 +341,17 @@ export abstract class QueueProcessingServiceBase extends Construct { */ private readonly cpuTargetUtilizationPercent: number; + /** + * Flag to enable Backlog per instance based scaling on the service. + * This will scale the service based on the number of messages in the queue divided by the number of running tasks. + */ + private readonly enableBacklogPerInstanceBasedScaling: boolean; + + /** + * The target Backlog per instance for Backlog per instance based scaling strategy when enabled. + */ + private readonly backlogPerInstanceTargetValue?: number; + /** * Constructs a new instance of the QueueProcessingServiceBase class. */ @@ -380,6 +404,21 @@ export abstract class QueueProcessingServiceBase extends Construct { this.secrets = props.secrets; this.disableCpuBasedScaling = props.disableCpuBasedScaling ?? false; this.cpuTargetUtilizationPercent = props.cpuTargetUtilizationPercent ?? 50; + this.enableBacklogPerInstanceBasedScaling = props.enableBacklogPerInstanceBasedScaling ?? false; + + if (this.enableBacklogPerInstanceBasedScaling) { + if (props.backlogPerInstanceTargetValue === undefined) { + this.backlogPerInstanceTargetValue = 100; + } else if ( + !Number.isFinite(props.backlogPerInstanceTargetValue) || + props.backlogPerInstanceTargetValue <= 0 || + props.backlogPerInstanceTargetValue >= 1_000_000_000 + ) { + throw new Error(`Invalid value for 'backlogPerInstanceTargetValue'. It must be a finite number > 0 and < 1_000_000_000. Received: ${props.backlogPerInstanceTargetValue}`); + } else { + this.backlogPerInstanceTargetValue = props.backlogPerInstanceTargetValue; + } + } this.desiredCount = props.desiredTaskCount ?? 1; @@ -418,11 +457,37 @@ export abstract class QueueProcessingServiceBase extends Construct { targetUtilizationPercent: this.cpuTargetUtilizationPercent, }); } - scalingTarget.scaleOnMetric('QueueMessagesVisibleScaling', { - metric: this.sqsQueue.metricApproximateNumberOfMessagesVisible(), - scalingSteps: this.scalingSteps, - cooldown: this.cooldown, - }); + + if (this.enableBacklogPerInstanceBasedScaling) { + scalingTarget.scaleToTrackCustomMetric('BacklogPerInstanceScaling', { + metric: new MathExpression({ + expression: 'm1 / m2', + usingMetrics: { + m1: this.sqsQueue.metricApproximateNumberOfMessagesVisible({ + period: Duration.minutes(1), + statistic: Stats.SUM, + }), + m2: new Metric({ + namespace: 'ECS/ContainerInsights', + metricName: 'RunningTaskCount', + dimensionsMap: { + ClusterName: this.cluster.clusterName, + ServiceName: service.serviceName, + }, + statistic: Stats.AVERAGE, + period: Duration.minutes(1), + }), + }, + }), + targetValue: this.backlogPerInstanceTargetValue!, + }); + } else { + scalingTarget.scaleOnMetric('QueueMessagesVisibleScaling', { + metric: this.sqsQueue.metricApproximateNumberOfMessagesVisible(), + scalingSteps: this.scalingSteps, + cooldown: this.cooldown, + }); + } } /** diff --git a/packages/aws-cdk-lib/aws-ecs-patterns/test/fargate/queue-processing-fargate-service.test.ts b/packages/aws-cdk-lib/aws-ecs-patterns/test/fargate/queue-processing-fargate-service.test.ts index b4290f9c15f54..296dccc6b0e33 100644 --- a/packages/aws-cdk-lib/aws-ecs-patterns/test/fargate/queue-processing-fargate-service.test.ts +++ b/packages/aws-cdk-lib/aws-ecs-patterns/test/fargate/queue-processing-fargate-service.test.ts @@ -4,7 +4,7 @@ import { AutoScalingGroup } from '../../../aws-autoscaling'; import * as ec2 from '../../../aws-ec2'; import { MachineImage } from '../../../aws-ec2'; import * as ecs from '../../../aws-ecs'; -import { AsgCapacityProvider } from '../../../aws-ecs'; +import { AsgCapacityProvider, ContainerInsights } from '../../../aws-ecs'; import * as sqs from '../../../aws-sqs'; import { Queue } from '../../../aws-sqs'; import * as cdk from '../../../core'; @@ -1005,3 +1005,111 @@ test('test Fargate queue worker service construct - with no taskDefinition or im }).toThrow(new Error('You must specify one of: taskDefinition or image')); }); +test('test Fargate queue worker service construct - with backlog per instance scaling enabled', () => { + // GIVEN + const stack = new cdk.Stack(); + const vpc = new ec2.Vpc(stack, 'VPC'); + const cluster = new ecs.Cluster(stack, 'Cluster', { vpc, containerInsightsV2: ContainerInsights.ENABLED }); + cluster.addAsgCapacityProvider(new AsgCapacityProvider(stack, 'DefaultAutoScalingGroupProvider', { + autoScalingGroup: new AutoScalingGroup(stack, 'DefaultAutoScalingGroup', { + vpc, + instanceType: new ec2.InstanceType('t2.micro'), + machineImage: MachineImage.latestAmazonLinux(), + }), + })); + const queue = new sqs.Queue(stack, 'fargate-test-queue', { + queueName: 'fargate-test-sqs-queue', + }); + + // WHEN + new ecsPatterns.QueueProcessingFargateService(stack, 'Service', { + cluster, + memoryLimitMiB: 512, + image: ecs.ContainerImage.fromRegistry('test'), + command: ['-c', '4', 'amazon.com'], + enableLogging: false, + environment: { + TEST_ENVIRONMENT_VARIABLE1: 'test environment variable 1 value', + TEST_ENVIRONMENT_VARIABLE2: 'test environment variable 2 value', + }, + queue, + maxScalingCapacity: 5, + minHealthyPercent: 60, + maxHealthyPercent: 150, + serviceName: 'fargate-test-service', + family: 'fargate-task-family', + platformVersion: ecs.FargatePlatformVersion.VERSION1_4, + circuitBreaker: { rollback: true }, + disableCpuBasedScaling: true, + enableBacklogPerInstanceBasedScaling: true, + backlogPerInstanceTargetValue: 100, + }); + + // THEN - Customized Backlog per Instance Metric set + Template.fromStack(stack). hasResourceProperties('AWS::ApplicationAutoScaling::ScalingPolicy', { + PolicyType: 'TargetTrackingScaling', + TargetTrackingScalingPolicyConfiguration: { + CustomizedMetricSpecification: { + Metrics: [ + { + Id: 'm1', + MetricStat: { + Metric: { + Dimensions: [ + { + Name: 'QueueName', + Value: { + 'Fn::GetAtt': [ + 'fargatetestqueue28B43841', + 'QueueName', + ], + }, + }, + ], + MetricName: 'ApproximateNumberOfMessagesVisible', + Namespace: 'AWS/SQS', + }, + Stat: 'Sum', + }, + ReturnData: false, + }, + { + Id: 'm2', + MetricStat: { + Metric: { + Dimensions: [ + { + Name: 'ClusterName', + Value: { + Ref: 'ClusterEB0386A7', + }, + }, + { + Name: 'ServiceName', + Value: { + 'Fn::GetAtt': [ + 'ServiceQueueProcessingFargateService217E8E72', + 'Name', + ], + }, + }, + ], + MetricName: 'RunningTaskCount', + Namespace: 'ECS/ContainerInsights', + }, + Stat: 'Average', + }, + ReturnData: false, + }, + { + Expression: 'm1 / m2', + Id: 'expression', + ReturnData: true, + }, + ], + }, + TargetValue: 100, + }, + }); +}); +