// Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Distributed Load Testing stack test 1`] = ` Object { "AWSTemplateFormatVersion": "2010-09-09", "Conditions": Object { "BoolExistingVPC": Object { "Fn::Not": Array [ Object { "Fn::Equals": Array [ Object { "Ref": "ExistingVPCId", }, "", ], }, ], }, "CreateFargateVPCResources": Object { "Fn::Equals": Array [ Object { "Ref": "ExistingVPCId", }, "", ], }, "SendAnonymousUsage": Object { "Fn::Equals": Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "SendAnonymousUsage", ], }, "Yes", ], }, }, "Description": "Distributed Load Testing on AWS is a reference architecture to perform application load testing at scale.", "Mappings": Object { "ServiceprincipalMap": Object { "af-south-1": Object { "states": "states.af-south-1.amazonaws.com", }, "ap-east-1": Object { "states": "states.ap-east-1.amazonaws.com", }, "ap-northeast-1": Object { "states": "states.ap-northeast-1.amazonaws.com", }, "ap-northeast-2": Object { "states": "states.ap-northeast-2.amazonaws.com", }, "ap-northeast-3": Object { "states": "states.ap-northeast-3.amazonaws.com", }, "ap-south-1": Object { "states": "states.ap-south-1.amazonaws.com", }, "ap-south-2": Object { "states": "states.ap-south-2.amazonaws.com", }, "ap-southeast-1": Object { "states": "states.ap-southeast-1.amazonaws.com", }, "ap-southeast-2": Object { "states": "states.ap-southeast-2.amazonaws.com", }, "ap-southeast-3": Object { "states": "states.ap-southeast-3.amazonaws.com", }, "ca-central-1": Object { "states": "states.ca-central-1.amazonaws.com", }, "cn-north-1": Object { "states": "states.cn-north-1.amazonaws.com", }, "cn-northwest-1": Object { "states": "states.cn-northwest-1.amazonaws.com", }, "eu-central-1": Object { "states": "states.eu-central-1.amazonaws.com", }, "eu-central-2": Object { "states": "states.eu-central-2.amazonaws.com", }, "eu-north-1": Object { "states": "states.eu-north-1.amazonaws.com", }, "eu-south-1": Object { "states": "states.eu-south-1.amazonaws.com", }, "eu-south-2": Object { "states": "states.eu-south-2.amazonaws.com", }, "eu-west-1": Object { "states": "states.eu-west-1.amazonaws.com", }, "eu-west-2": Object { "states": "states.eu-west-2.amazonaws.com", }, "eu-west-3": Object { "states": "states.eu-west-3.amazonaws.com", }, "me-central-1": Object { "states": "states.me-central-1.amazonaws.com", }, "me-south-1": Object { "states": "states.me-south-1.amazonaws.com", }, "sa-east-1": Object { "states": "states.sa-east-1.amazonaws.com", }, "us-east-1": Object { "states": "states.us-east-1.amazonaws.com", }, "us-east-2": Object { "states": "states.us-east-2.amazonaws.com", }, "us-gov-east-1": Object { "states": "states.us-gov-east-1.amazonaws.com", }, "us-gov-west-1": Object { "states": "states.us-gov-west-1.amazonaws.com", }, "us-iso-east-1": Object { "states": "states.amazonaws.com", }, "us-iso-west-1": Object { "states": "states.amazonaws.com", }, "us-isob-east-1": Object { "states": "states.amazonaws.com", }, "us-west-1": Object { "states": "states.us-west-1.amazonaws.com", }, "us-west-2": Object { "states": "states.us-west-2.amazonaws.com", }, }, "Solution": Object { "Config": Object { "CodeVersion": "testversion", "ContainerImage": "testRegistry/distributed-load-testing-on-aws-load-tester:testTag", "KeyPrefix": "distributed-load-testing-on-aws/testversion", "S3Bucket": "testbucket", "SendAnonymousUsage": "Yes", "SolutionId": "testId", "URL": "http://testurl.com", }, }, }, "Metadata": Object { "AWS::CloudFormation::Interface": Object { "ParameterGroups": Array [ Object { "Label": Object { "default": "Console access", }, "Parameters": Array [ "AdminName", "AdminEmail", ], }, Object { "Label": Object { "default": "Enter values here to use your own existing VPC", }, "Parameters": Array [ "ExistingVPCId", "ExistingSubnetA", "ExistingSubnetB", ], }, Object { "Label": Object { "default": "Or have the solution create a new AWS Fargate VPC", }, "Parameters": Array [ "VpcCidrBlock", "SubnetACidrBlock", "SubnetBCidrBlock", "EgressCidr", ], }, ], "ParameterLabels": Object { "AdminEmail": Object { "default": "* Console Administrator Email", }, "AdminName": Object { "default": "* Console Administrator Name", }, "EgressCidr": Object { "default": "AWS Fargate SecurityGroup CIDR Block", }, "ExistingSubnetA": Object { "default": "The ID of a subnet within the existing VPC. Ex: \`subnet-7h8i9j0k\`", }, "ExistingSubnetB": Object { "default": "The ID of a subnet within the existing VPC. Ex: \`subnet-1x2y3z\`", }, "ExistingVPCId": Object { "default": "The ID of an existing VPC in this region. Ex: \`vpc-1a2b3c4d5e6f\`", }, "SubnetACidrBlock": Object { "default": "AWS Fargate Subnet A CIDR Block", }, "SubnetBCidrBlock": Object { "default": "AWS Fargate Subnet A CIDR Block", }, "VpcCidrBlock": Object { "default": "AWS Fargate VPC CIDR Block", }, }, }, }, "Outputs": Object { "AppRegistryApplicationManagerUrl775D5C3D": Object { "Description": "Application manager url for the application created.", "Value": Object { "Fn::Join": Array [ "", Array [ "https://", Object { "Ref": "AWS::Region", }, ".console.aws.amazon.com/systems-manager/appmanager/application/AWS_AppRegistry_Application-", Object { "Fn::Join": Array [ "-", Array [ "distributed-load-testing-on-aws", Object { "Ref": "AWS::Region", }, Object { "Ref": "AWS::AccountId", }, ], ], }, ], ], }, }, "Console": Object { "Description": "Console URL", "Value": Object { "Fn::GetAtt": Array [ "DLTConsoleResourcesDLTCloudFrontToS3CloudFrontDistribution3EF384B4", "DomainName", ], }, }, "DLTApiEndpointD98B09AC": Object { "Value": Object { "Fn::Join": Array [ "", Array [ "https://", Object { "Ref": "DLTApi0C903EB5", }, ".execute-api.", Object { "Ref": "AWS::Region", }, ".", Object { "Ref": "AWS::URLSuffix", }, "/", Object { "Ref": "DLTApiDeploymentStageprodC81F8DCB", }, "/", ], ], }, }, "RegionalCFTemplate": Object { "Description": "S3 URL for regional CloudFormation template", "Export": Object { "Name": "RegionalCFTemplate", }, "Value": Object { "Fn::Join": Array [ "", Array [ "https://s3.", Object { "Ref": "AWS::Region", }, ".", Object { "Ref": "AWS::URLSuffix", }, "/", Object { "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21", }, "/regional-template/distributed-load-testing-on-aws-regional.template", ], ], }, }, "SolutionUUID": Object { "Description": "Solution UUID", "Value": Object { "Fn::GetAtt": Array [ "DLTCustomResourcesCustomResourceUuidD1C03F15", "UUID", ], }, }, }, "Parameters": Object { "AdminEmail": Object { "AllowedPattern": "^[_A-Za-z0-9-\\\\+]+(\\\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\\\.[A-Za-z0-9]+)*(\\\\.[A-Za-z]{2,})$", "ConstraintDescription": "Admin email must be a valid email address", "Description": "Admin user email address to access the Distributed Load Testing Console", "MinLength": 5, "Type": "String", }, "AdminName": Object { "AllowedPattern": "[a-zA-Z0-9-]+", "ConstraintDescription": "Admin username must be a minimum of 4 characters and cannot include spaces", "Description": "Admin user name to access the Distributed Load Testing console", "MaxLength": 20, "MinLength": 4, "Type": "String", }, "EgressCidr": Object { "AllowedPattern": "(?:^$|(\\\\d{1,3})\\\\.(\\\\d{1,3})\\\\.(\\\\d{1,3})\\\\.(\\\\d{1,3})/(\\\\d{1,2}))", "ConstraintDescription": "The Egress CIDR block must be a valid IP CIDR range of the form x.x.x.x/x.", "Default": "0.0.0.0/0", "Description": "CIDR Block to restrict the ECS container outbound access", "MaxLength": 18, "MinLength": 9, "Type": "String", }, "ExistingSubnetA": Object { "AllowedPattern": "(?:^$|^subnet-[a-zA-Z0-9-]+)", "Description": "First existing subnet", "Type": "String", }, "ExistingSubnetB": Object { "AllowedPattern": "(?:^$|^subnet-[a-zA-Z0-9-]+)", "Description": "Second existing subnet", "Type": "String", }, "ExistingVPCId": Object { "AllowedPattern": "(?:^$|^vpc-[a-zA-Z0-9-]+)", "Description": "Existing VPC ID", "Type": "String", }, "SubnetACidrBlock": Object { "AllowedPattern": "(?:^$|(\\\\d{1,3})\\\\.(\\\\d{1,3})\\\\.(\\\\d{1,3})\\\\.(\\\\d{1,3})/(\\\\d{1,2}))", "ConstraintDescription": "The subnet CIDR block must be a valid IP CIDR range of the form x.x.x.x/x.", "Default": "192.168.0.0/20", "Description": "CIDR block for subnet A of the AWS Fargate VPC", "MaxLength": 18, "MinLength": 9, "Type": "String", }, "SubnetBCidrBlock": Object { "AllowedPattern": "(?:^$|(\\\\d{1,3})\\\\.(\\\\d{1,3})\\\\.(\\\\d{1,3})\\\\.(\\\\d{1,3})/(\\\\d{1,2}))", "ConstraintDescription": "The subnet CIDR block must be a valid IP CIDR range of the form x.x.x.x/x.", "Default": "192.168.16.0/20", "Description": "CIDR block for subnet B of the AWS Fargate VPC", "Type": "String", }, "VpcCidrBlock": Object { "AllowedPattern": "(?:^$|(\\\\d{1,3})\\\\.(\\\\d{1,3})\\\\.(\\\\d{1,3})\\\\.(\\\\d{1,3})/(\\\\d{1,2}))", "ConstraintDescription": "The VPC CIDR block must be a valid IP CIDR range of the form x.x.x.x/x.", "Default": "192.168.0.0/16", "Description": "CIDR block of the new VPC where AWS Fargate will be placed", "MaxLength": 18, "MinLength": 9, "Type": "String", }, }, "Resources": Object { "AppRegistry968496A3": Object { "Properties": Object { "Description": "Service Catalog application to track and manage all your resources for the solution Distributed Load Testing", "Name": Object { "Fn::Join": Array [ "-", Array [ "distributed-load-testing-on-aws", Object { "Ref": "AWS::Region", }, Object { "Ref": "AWS::AccountId", }, ], ], }, "Tags": Object { "SolutionId": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, "Solutions:ApplicationType": "AWS-Solutions", "Solutions:SolutionID": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, "Solutions:SolutionName": "Distributed Load Testing", "Solutions:SolutionVersion": Object { "Fn::FindInMap": Array [ "Solution", "Config", "CodeVersion", ], }, }, }, "Type": "AWS::ServiceCatalogAppRegistry::Application", }, "AppRegistryAssociation": Object { "Properties": Object { "Application": Object { "Fn::GetAtt": Array [ "AppRegistry968496A3", "Id", ], }, "Resource": Object { "Ref": "AWS::StackId", }, "ResourceType": "CFN_STACK", }, "Type": "AWS::ServiceCatalogAppRegistry::ResourceAssociation", }, "AppRegistryAttributeGroupAssociation17c9944e720456F5A644": Object { "Properties": Object { "Application": Object { "Fn::GetAtt": Array [ "AppRegistry968496A3", "Id", ], }, "AttributeGroup": Object { "Fn::GetAtt": Array [ "DefaultApplicationAttributesFC1CC26B", "Id", ], }, }, "Type": "AWS::ServiceCatalogAppRegistry::AttributeGroupAssociation", }, "DLTApi0C903EB5": Object { "Properties": Object { "Description": Object { "Fn::Join": Array [ "", Array [ "Distributed Load Testing API - version ", Object { "Fn::FindInMap": Array [ "Solution", "Config", "CodeVersion", ], }, ], ], }, "EndpointConfiguration": Object { "Types": Array [ "EDGE", ], }, "Name": "DLTApi", "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::ApiGateway::RestApi", }, "DLTApiAPIAllRequestValidator02C9D47F": Object { "Properties": Object { "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, "ValidateRequestBody": true, "ValidateRequestParameters": true, }, "Type": "AWS::ApiGateway::RequestValidator", }, "DLTApiAPILoggingRole119E64B1": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ Object { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": Object { "Service": "apigateway.amazonaws.com", }, }, ], "Version": "2012-10-17", }, "Policies": Array [ Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": Array [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:DescribeLogGroups", "logs:DescribeLogStreams", "logs:PutLogEvents", "logs:GetLogEvents", "logs:FilterLogEvent", ], "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":logs:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":*", ], ], }, }, ], "Version": "2012-10-17", }, "PolicyName": "apiLoggingPolicy", }, ], "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::IAM::Role", }, "DLTApiAPILogsF7751EF3": Object { "DeletionPolicy": "Retain", "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W84", "reason": "KMS encryption unnecessary for log group", }, ], }, }, "Properties": Object { "RetentionInDays": 365, "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Retain", }, "DLTApiAccount80CB63FF": Object { "DeletionPolicy": "Retain", "DependsOn": Array [ "DLTApi0C903EB5", ], "Properties": Object { "CloudWatchRoleArn": Object { "Fn::GetAtt": Array [ "DLTApiCloudWatchRoleD45E4DD6", "Arn", ], }, }, "Type": "AWS::ApiGateway::Account", "UpdateReplacePolicy": "Retain", }, "DLTApiApiAccountConfigBF306CC3": Object { "DependsOn": Array [ "DLTApi0C903EB5", ], "Properties": Object { "CloudWatchRoleArn": Object { "Fn::GetAtt": Array [ "DLTApiAPILoggingRole119E64B1", "Arn", ], }, }, "Type": "AWS::ApiGateway::Account", }, "DLTApiCloudWatchRoleD45E4DD6": Object { "DeletionPolicy": "Retain", "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ Object { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": Object { "Service": "apigateway.amazonaws.com", }, }, ], "Version": "2012-10-17", }, "ManagedPolicyArns": Array [ Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs", ], ], }, ], "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::IAM::Role", "UpdateReplacePolicy": "Retain", }, "DLTApiDLTAPIServicesLambda9D76BA5C": Object { "DependsOn": Array [ "DLTApiDLTAPIServicesLambdaRole4465EAA4", ], "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W58", "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs.", }, Object { "id": "W89", "reason": "VPC not needed for lambda", }, Object { "id": "W92", "reason": "Does not run concurrent executions", }, ], }, }, "Properties": Object { "Code": Object { "S3Bucket": Object { "Fn::Join": Array [ "-", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "S3Bucket", ], }, Object { "Ref": "AWS::Region", }, ], ], }, "S3Key": Object { "Fn::Join": Array [ "", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "KeyPrefix", ], }, "/api-services.zip", ], ], }, }, "Description": "API microservices for creating, updating, listing and deleting test scenarios", "Environment": Object { "Variables": Object { "HISTORY_TABLE": Object { "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC", }, "METRIC_URL": Object { "Fn::FindInMap": Array [ "Solution", "Config", "URL", ], }, "SCENARIOS_BUCKET": Object { "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21", }, "SCENARIOS_TABLE": Object { "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A", }, "SEND_METRIC": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SendAnonymousUsage", ], }, "SOLUTION_ID": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, "STACK_ID": Object { "Ref": "AWS::StackId", }, "STATE_MACHINE_ARN": Object { "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535", }, "TASK_CANCELER_ARN": Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskCanceler4E12BDA6", "Arn", ], }, "UUID": Object { "Fn::GetAtt": Array [ "DLTCustomResourcesCustomResourceUuidD1C03F15", "UUID", ], }, "VERSION": Object { "Fn::FindInMap": Array [ "Solution", "Config", "CodeVersion", ], }, }, }, "Handler": "index.handler", "Role": Object { "Fn::GetAtt": Array [ "DLTApiDLTAPIServicesLambdaRole4465EAA4", "Arn", ], }, "Runtime": "nodejs16.x", "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], "Timeout": 120, }, "Type": "AWS::Lambda::Function", }, "DLTApiDLTAPIServicesLambdaDLTApiInvokePermissionC6CBE43A": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ "DLTApiDLTAPIServicesLambda9D76BA5C", "Arn", ], }, "Principal": "apigateway.amazonaws.com", "SourceArn": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":execute-api:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":", Object { "Ref": "DLTApi0C903EB5", }, "/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, "DLTApiDLTAPIServicesLambdaRole4465EAA4": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W11", "reason": "ecs:ListTasks and cloudformation:ListExports do not support resource level permissions", }, ], }, }, "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ Object { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": Object { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, "Policies": Array [ Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": "ecs:ListTasks", "Effect": "Allow", "Resource": "*", }, Object { "Action": Array [ "ecs:RunTask", "ecs:DescribeTasks", ], "Effect": "Allow", "Resource": Array [ Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":ecs:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":task/*", ], ], }, Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":ecs:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":task-definition/", ], ], }, ], }, Object { "Action": "iam:PassRole", "Effect": "Allow", "Resource": Object { "Fn::GetAtt": Array [ "DLTEcsDLTTaskExecutionRoleDE668717", "Arn", ], }, }, Object { "Action": "states:StartExecution", "Effect": "Allow", "Resource": Object { "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535", }, }, Object { "Action": "logs:DeleteMetricFilter", "Effect": "Allow", "Resource": Object { "Fn::GetAtt": Array [ "DLTEcsDLTCloudWatchLogsGroupFE9EC144", "Arn", ], }, }, Object { "Action": "cloudwatch:DeleteDashboards", "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":cloudwatch::", Object { "Ref": "AWS::AccountId", }, ":dashboard/EcsLoadTesting*", ], ], }, }, Object { "Action": "cloudformation:ListExports", "Effect": "Allow", "Resource": "*", }, Object { "Action": Array [ "ecs:ListAccountSettings", "ecs:ListTasks", "ecs:ListClusters", "ecs:DescribeClusters", "ecs:DescribeTaskDefinition", ], "Effect": "Allow", "Resource": "*", }, Object { "Action": "servicequotas:GetServiceQuota", "Effect": "Allow", "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "DLTAPIServicesLambdaPolicy", }, ], "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::IAM::Role", }, "DLTApiDeployment098FF888cb409d5b175926be9719cf717cb2aab7": Object { "DependsOn": Array [ "DLTApiAPIAllRequestValidator02C9D47F", "DLTApiOPTIONS823B5F09", "DLTApiregionsANY2B8B3A61", "DLTApiregionsOPTIONSCB04B2B1", "DLTApiregionsC4EF9783", "DLTApiscenariostestIdANY993028D3", "DLTApiscenariostestIdOPTIONS0B339CE6", "DLTApiscenariostestId4C170989", "DLTApiscenariosANYDEF83622", "DLTApiscenariosOPTIONS6F514DA3", "DLTApiscenariosB6B76329", "DLTApitasksANY60403A44", "DLTApitasksOPTIONSDABED809", "DLTApitasks0A512C83", "DLTApivCPUDetailsANY4E680392", "DLTApivCPUDetailsOPTIONS8854EB1F", "DLTApivCPUDetailsABB0980D", ], "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W68", "reason": "The solution does not require the usage plan.", }, ], }, }, "Properties": Object { "Description": Object { "Fn::Join": Array [ "", Array [ "Distributed Load Testing API - version ", Object { "Fn::FindInMap": Array [ "Solution", "Config", "CodeVersion", ], }, ], ], }, "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Deployment", }, "DLTApiDeploymentStageprodC81F8DCB": Object { "DependsOn": Array [ "DLTApiAccount80CB63FF", ], "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W64", "reason": "The solution does not require the usage plan.", }, ], }, }, "Properties": Object { "AccessLogSetting": Object { "DestinationArn": Object { "Fn::GetAtt": Array [ "DLTApiAPILogsF7751EF3", "Arn", ], }, "Format": "{\\"requestId\\":\\"$context.requestId\\",\\"ip\\":\\"$context.identity.sourceIp\\",\\"user\\":\\"$context.identity.user\\",\\"caller\\":\\"$context.identity.caller\\",\\"requestTime\\":\\"$context.requestTime\\",\\"httpMethod\\":\\"$context.httpMethod\\",\\"resourcePath\\":\\"$context.resourcePath\\",\\"status\\":\\"$context.status\\",\\"protocol\\":\\"$context.protocol\\",\\"responseLength\\":\\"$context.responseLength\\"}", }, "DeploymentId": Object { "Ref": "DLTApiDeployment098FF888cb409d5b175926be9719cf717cb2aab7", }, "MethodSettings": Array [ Object { "DataTraceEnabled": false, "HttpMethod": "*", "LoggingLevel": "INFO", "ResourcePath": "/*", }, ], "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, "StageName": "prod", "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], "TracingEnabled": true, }, "Type": "AWS::ApiGateway::Stage", }, "DLTApiLambdaApiEventsPolicy63BB60C8": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": Array [ "events:PutTargets", "events:PutRule", "events:DeleteRule", "events:RemoveTargets", ], "Effect": "Allow", "Resource": Array [ Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":events:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":rule/*Scheduled", ], ], }, Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":events:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":rule/*Create", ], ], }, ], }, Object { "Action": "events:ListRules", "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":events:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":rule/*", ], ], }, }, ], "Version": "2012-10-17", }, "PolicyName": "DLTApiLambdaApiEventsPolicy63BB60C8", "Roles": Array [ Object { "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4", }, ], }, "Type": "AWS::IAM::Policy", }, "DLTApiLambdaApiPermissionPolicyE12EEC7D": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": Array [ "lambda:AddPermission", "lambda:RemovePermission", ], "Effect": "Allow", "Resource": Object { "Fn::GetAtt": Array [ "DLTApiDLTAPIServicesLambda9D76BA5C", "Arn", ], }, }, ], "Version": "2012-10-17", }, "PolicyName": "DLTApiLambdaApiPermissionPolicyE12EEC7D", "Roles": Array [ Object { "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4", }, ], }, "Type": "AWS::IAM::Policy", }, "DLTApiOPTIONS823B5F09": Object { "Properties": Object { "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { "IntegrationResponses": Array [ Object { "ResponseParameters": Object { "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'", "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'", "method.response.header.Access-Control-Allow-Origin": "'*'", }, "StatusCode": "200", }, ], "RequestTemplates": Object { "application/json": "{ statusCode: 200 }", }, "Type": "MOCK", }, "MethodResponses": Array [ Object { "ResponseParameters": Object { "method.response.header.Access-Control-Allow-Headers": true, "method.response.header.Access-Control-Allow-Methods": true, "method.response.header.Access-Control-Allow-Origin": true, }, "StatusCode": "200", }, ], "ResourceId": Object { "Fn::GetAtt": Array [ "DLTApi0C903EB5", "RootResourceId", ], }, "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Method", }, "DLTApiregionsANY2B8B3A61": Object { "Properties": Object { "AuthorizationType": "AWS_IAM", "HttpMethod": "ANY", "Integration": Object { "ContentHandling": "CONVERT_TO_TEXT", "IntegrationHttpMethod": "POST", "IntegrationResponses": Array [ Object { "StatusCode": "200", }, ], "PassthroughBehavior": "WHEN_NO_MATCH", "Type": "AWS_PROXY", "Uri": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":apigateway:", Object { "Ref": "AWS::Region", }, ":lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ "DLTApiDLTAPIServicesLambda9D76BA5C", "Arn", ], }, "/invocations", ], ], }, }, "MethodResponses": Array [ Object { "ResponseModels": Object { "application/json": "Empty", }, "StatusCode": "200", }, ], "RequestValidatorId": Object { "Ref": "DLTApiAPIAllRequestValidator02C9D47F", }, "ResourceId": Object { "Ref": "DLTApiregionsC4EF9783", }, "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Method", }, "DLTApiregionsC4EF9783": Object { "Properties": Object { "ParentId": Object { "Fn::GetAtt": Array [ "DLTApi0C903EB5", "RootResourceId", ], }, "PathPart": "regions", "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Resource", }, "DLTApiregionsOPTIONSCB04B2B1": Object { "Properties": Object { "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { "IntegrationResponses": Array [ Object { "ResponseParameters": Object { "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'", "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'", "method.response.header.Access-Control-Allow-Origin": "'*'", }, "StatusCode": "200", }, ], "RequestTemplates": Object { "application/json": "{ statusCode: 200 }", }, "Type": "MOCK", }, "MethodResponses": Array [ Object { "ResponseParameters": Object { "method.response.header.Access-Control-Allow-Headers": true, "method.response.header.Access-Control-Allow-Methods": true, "method.response.header.Access-Control-Allow-Origin": true, }, "StatusCode": "200", }, ], "ResourceId": Object { "Ref": "DLTApiregionsC4EF9783", }, "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Method", }, "DLTApiscenariosANYDEF83622": Object { "Properties": Object { "AuthorizationType": "AWS_IAM", "HttpMethod": "ANY", "Integration": Object { "ContentHandling": "CONVERT_TO_TEXT", "IntegrationHttpMethod": "POST", "IntegrationResponses": Array [ Object { "StatusCode": "200", }, ], "PassthroughBehavior": "WHEN_NO_MATCH", "Type": "AWS_PROXY", "Uri": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":apigateway:", Object { "Ref": "AWS::Region", }, ":lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ "DLTApiDLTAPIServicesLambda9D76BA5C", "Arn", ], }, "/invocations", ], ], }, }, "MethodResponses": Array [ Object { "ResponseModels": Object { "application/json": "Empty", }, "StatusCode": "200", }, ], "RequestValidatorId": Object { "Ref": "DLTApiAPIAllRequestValidator02C9D47F", }, "ResourceId": Object { "Ref": "DLTApiscenariosB6B76329", }, "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Method", }, "DLTApiscenariosB6B76329": Object { "Properties": Object { "ParentId": Object { "Fn::GetAtt": Array [ "DLTApi0C903EB5", "RootResourceId", ], }, "PathPart": "scenarios", "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Resource", }, "DLTApiscenariosOPTIONS6F514DA3": Object { "Properties": Object { "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { "IntegrationResponses": Array [ Object { "ResponseParameters": Object { "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'", "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'", "method.response.header.Access-Control-Allow-Origin": "'*'", }, "StatusCode": "200", }, ], "RequestTemplates": Object { "application/json": "{ statusCode: 200 }", }, "Type": "MOCK", }, "MethodResponses": Array [ Object { "ResponseParameters": Object { "method.response.header.Access-Control-Allow-Headers": true, "method.response.header.Access-Control-Allow-Methods": true, "method.response.header.Access-Control-Allow-Origin": true, }, "StatusCode": "200", }, ], "ResourceId": Object { "Ref": "DLTApiscenariosB6B76329", }, "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Method", }, "DLTApiscenariostestId4C170989": Object { "Properties": Object { "ParentId": Object { "Ref": "DLTApiscenariosB6B76329", }, "PathPart": "{testId}", "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Resource", }, "DLTApiscenariostestIdANY993028D3": Object { "Properties": Object { "AuthorizationType": "AWS_IAM", "HttpMethod": "ANY", "Integration": Object { "ContentHandling": "CONVERT_TO_TEXT", "IntegrationHttpMethod": "POST", "IntegrationResponses": Array [ Object { "StatusCode": "200", }, ], "PassthroughBehavior": "WHEN_NO_MATCH", "Type": "AWS_PROXY", "Uri": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":apigateway:", Object { "Ref": "AWS::Region", }, ":lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ "DLTApiDLTAPIServicesLambda9D76BA5C", "Arn", ], }, "/invocations", ], ], }, }, "MethodResponses": Array [ Object { "ResponseModels": Object { "application/json": "Empty", }, "StatusCode": "200", }, ], "RequestValidatorId": Object { "Ref": "DLTApiAPIAllRequestValidator02C9D47F", }, "ResourceId": Object { "Ref": "DLTApiscenariostestId4C170989", }, "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Method", }, "DLTApiscenariostestIdOPTIONS0B339CE6": Object { "Properties": Object { "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { "IntegrationResponses": Array [ Object { "ResponseParameters": Object { "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'", "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'", "method.response.header.Access-Control-Allow-Origin": "'*'", }, "StatusCode": "200", }, ], "RequestTemplates": Object { "application/json": "{ statusCode: 200 }", }, "Type": "MOCK", }, "MethodResponses": Array [ Object { "ResponseParameters": Object { "method.response.header.Access-Control-Allow-Headers": true, "method.response.header.Access-Control-Allow-Methods": true, "method.response.header.Access-Control-Allow-Origin": true, }, "StatusCode": "200", }, ], "ResourceId": Object { "Ref": "DLTApiscenariostestId4C170989", }, "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Method", }, "DLTApitasks0A512C83": Object { "Properties": Object { "ParentId": Object { "Fn::GetAtt": Array [ "DLTApi0C903EB5", "RootResourceId", ], }, "PathPart": "tasks", "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Resource", }, "DLTApitasksANY60403A44": Object { "Properties": Object { "AuthorizationType": "AWS_IAM", "HttpMethod": "ANY", "Integration": Object { "ContentHandling": "CONVERT_TO_TEXT", "IntegrationHttpMethod": "POST", "IntegrationResponses": Array [ Object { "StatusCode": "200", }, ], "PassthroughBehavior": "WHEN_NO_MATCH", "Type": "AWS_PROXY", "Uri": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":apigateway:", Object { "Ref": "AWS::Region", }, ":lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ "DLTApiDLTAPIServicesLambda9D76BA5C", "Arn", ], }, "/invocations", ], ], }, }, "MethodResponses": Array [ Object { "ResponseModels": Object { "application/json": "Empty", }, "StatusCode": "200", }, ], "RequestValidatorId": Object { "Ref": "DLTApiAPIAllRequestValidator02C9D47F", }, "ResourceId": Object { "Ref": "DLTApitasks0A512C83", }, "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Method", }, "DLTApitasksOPTIONSDABED809": Object { "Properties": Object { "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { "IntegrationResponses": Array [ Object { "ResponseParameters": Object { "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'", "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'", "method.response.header.Access-Control-Allow-Origin": "'*'", }, "StatusCode": "200", }, ], "RequestTemplates": Object { "application/json": "{ statusCode: 200 }", }, "Type": "MOCK", }, "MethodResponses": Array [ Object { "ResponseParameters": Object { "method.response.header.Access-Control-Allow-Headers": true, "method.response.header.Access-Control-Allow-Methods": true, "method.response.header.Access-Control-Allow-Origin": true, }, "StatusCode": "200", }, ], "ResourceId": Object { "Ref": "DLTApitasks0A512C83", }, "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Method", }, "DLTApivCPUDetailsABB0980D": Object { "Properties": Object { "ParentId": Object { "Fn::GetAtt": Array [ "DLTApi0C903EB5", "RootResourceId", ], }, "PathPart": "vCPUDetails", "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Resource", }, "DLTApivCPUDetailsANY4E680392": Object { "Properties": Object { "AuthorizationType": "AWS_IAM", "HttpMethod": "ANY", "Integration": Object { "ContentHandling": "CONVERT_TO_TEXT", "IntegrationHttpMethod": "POST", "IntegrationResponses": Array [ Object { "StatusCode": "200", }, ], "PassthroughBehavior": "WHEN_NO_MATCH", "Type": "AWS_PROXY", "Uri": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":apigateway:", Object { "Ref": "AWS::Region", }, ":lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ "DLTApiDLTAPIServicesLambda9D76BA5C", "Arn", ], }, "/invocations", ], ], }, }, "MethodResponses": Array [ Object { "ResponseModels": Object { "application/json": "Empty", }, "StatusCode": "200", }, ], "RequestValidatorId": Object { "Ref": "DLTApiAPIAllRequestValidator02C9D47F", }, "ResourceId": Object { "Ref": "DLTApivCPUDetailsABB0980D", }, "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Method", }, "DLTApivCPUDetailsOPTIONS8854EB1F": Object { "Properties": Object { "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { "IntegrationResponses": Array [ Object { "ResponseParameters": Object { "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'", "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'", "method.response.header.Access-Control-Allow-Origin": "'*'", }, "StatusCode": "200", }, ], "RequestTemplates": Object { "application/json": "{ statusCode: 200 }", }, "Type": "MOCK", }, "MethodResponses": Array [ Object { "ResponseParameters": Object { "method.response.header.Access-Control-Allow-Headers": true, "method.response.header.Access-Control-Allow-Methods": true, "method.response.header.Access-Control-Allow-Origin": true, }, "StatusCode": "200", }, ], "ResourceId": Object { "Ref": "DLTApivCPUDetailsABB0980D", }, "RestApiId": Object { "Ref": "DLTApi0C903EB5", }, }, "Type": "AWS::ApiGateway::Method", }, "DLTCognitoAuthCognitoAttachRole8337C7A4": Object { "Properties": Object { "IdentityPoolId": Object { "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F", }, "Roles": Object { "authenticated": Object { "Fn::GetAtt": Array [ "DLTCognitoAuthDLTCognitoAuthorizedRole9977D4DC", "Arn", ], }, "unauthenticated": Object { "Fn::GetAtt": Array [ "DLTCognitoAuthDLTCognitoUnauthorizedRole6FC43D42", "Arn", ], }, }, }, "Type": "AWS::Cognito::IdentityPoolRoleAttachment", }, "DLTCognitoAuthCognitoUser8FAEDC59": Object { "Properties": Object { "DesiredDeliveryMediums": Array [ "EMAIL", ], "ForceAliasCreation": true, "UserAttributes": Array [ Object { "Name": "email", "Value": Object { "Ref": "AdminEmail", }, }, Object { "Name": "nickname", "Value": Object { "Ref": "AdminName", }, }, Object { "Name": "email_verified", "Value": "true", }, ], "UserPoolId": Object { "Ref": "DLTCognitoAuthDLTUserPoolFA41A712", }, "Username": Object { "Ref": "AdminName", }, }, "Type": "AWS::Cognito::UserPoolUser", }, "DLTCognitoAuthDLTCognitoAuthorizedRole9977D4DC": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W11", "reason": "iot:AttachPrincipalPolicy does not allow for resource specification", }, ], }, }, "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ Object { "Action": "sts:AssumeRoleWithWebIdentity", "Condition": Object { "ForAnyValue:StringLike": Object { "cognito-identity.amazonaws.com:amr": "authenticated", }, "StringEquals": Object { "cognito-identity.amazonaws.com:aud": Object { "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F", }, }, }, "Effect": "Allow", "Principal": Object { "Federated": "cognito-identity.amazonaws.com", }, }, ], "Version": "2012-10-17", }, "Description": Object { "Fn::Join": Array [ "", Array [ Object { "Ref": "AWS::StackName", }, " Identity Pool authenticated role", ], ], }, "Policies": Array [ Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": "execute-api:Invoke", "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":execute-api:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":", Object { "Ref": "DLTApi0C903EB5", }, "/prod/*", ], ], }, }, Object { "Action": Array [ "s3:PutObject", "s3:GetObject", ], "Effect": "Allow", "Resource": Array [ Object { "Fn::Join": Array [ "", Array [ Object { "Fn::GetAtt": Array [ "DLTTestRunnerStorageDLTScenariosBucketA9290D21", "Arn", ], }, "/public/*", ], ], }, Object { "Fn::Join": Array [ "", Array [ Object { "Fn::GetAtt": Array [ "DLTTestRunnerStorageDLTScenariosBucketA9290D21", "Arn", ], }, "/cloudWatchImages/*", ], ], }, ], }, ], "Version": "2012-10-17", }, "PolicyName": "InvokeApiPolicy", }, Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": "iot:AttachPrincipalPolicy", "Effect": "Allow", "Resource": "*", }, Object { "Action": "iot:Connect", "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":iot:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":client/*", ], ], }, }, Object { "Action": "iot:Subscribe", "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":iot:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":topicfilter/*", ], ], }, }, Object { "Action": "iot:Receive", "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":iot:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":topic/*", ], ], }, }, ], "Version": "2012-10-17", }, "PolicyName": "IoTPolicy", }, ], "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::IAM::Role", }, "DLTCognitoAuthDLTCognitoUnauthorizedRole6FC43D42": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ Object { "Action": "sts:AssumeRoleWithWebIdentity", "Condition": Object { "ForAnyValue:StringLike": Object { "cognito-identity.amazonaws.com:amr": "unauthenticated", }, "StringEquals": Object { "cognito-identity.amazonaws.com:aud": Object { "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F", }, }, }, "Effect": "Allow", "Principal": Object { "Federated": "cognito-identity.amazonaws.com", }, }, ], "Version": "2012-10-17", }, "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::IAM::Role", }, "DLTCognitoAuthDLTIdentityPoolE110578F": Object { "Properties": Object { "AllowUnauthenticatedIdentities": false, "CognitoIdentityProviders": Array [ Object { "ClientId": Object { "Ref": "DLTCognitoAuthDLTUserPoolClientA2F8B2DB", }, "ProviderName": Object { "Fn::GetAtt": Array [ "DLTCognitoAuthDLTUserPoolFA41A712", "ProviderName", ], }, }, ], }, "Type": "AWS::Cognito::IdentityPool", }, "DLTCognitoAuthDLTUserPoolClientA2F8B2DB": Object { "Properties": Object { "AllowedOAuthFlows": Array [ "implicit", "code", ], "AllowedOAuthFlowsUserPoolClient": true, "AllowedOAuthScopes": Array [ "profile", "phone", "email", "openid", "aws.cognito.signin.user.admin", ], "CallbackURLs": Array [ "https://example.com", ], "ClientName": Object { "Fn::Join": Array [ "", Array [ Object { "Ref": "AWS::StackName", }, "-userpool-client", ], ], }, "GenerateSecret": false, "RefreshTokenValidity": 1440, "SupportedIdentityProviders": Array [ "COGNITO", ], "TokenValidityUnits": Object { "RefreshToken": "minutes", }, "UserPoolId": Object { "Ref": "DLTCognitoAuthDLTUserPoolFA41A712", }, "WriteAttributes": Array [ "address", "email", "phone_number", ], }, "Type": "AWS::Cognito::UserPoolClient", }, "DLTCognitoAuthDLTUserPoolFA41A712": Object { "DeletionPolicy": "Delete", "Properties": Object { "AccountRecoverySetting": Object { "RecoveryMechanisms": Array [ Object { "Name": "verified_phone_number", "Priority": 1, }, Object { "Name": "verified_email", "Priority": 2, }, ], }, "AdminCreateUserConfig": Object { "AllowAdminCreateUserOnly": true, "InviteMessageTemplate": Object { "EmailMessage": Object { "Fn::Join": Array [ "", Array [ "
Please use the credentials below to login to the Distributed Load Testing console.
Username: {username}
Password: {####}
Console: https://", Object { "Fn::GetAtt": Array [ "DLTConsoleResourcesDLTCloudFrontToS3CloudFrontDistribution3EF384B4", "DomainName", ], }, "/
", ], ], }, "EmailSubject": "Welcome to Distributed Load Testing", "SMSMessage": "Your username is {username} and temporary password is {####}.", }, }, "AliasAttributes": Array [ "email", ], "AutoVerifiedAttributes": Array [ "email", ], "EmailVerificationMessage": "The verification code to your new account is {####}", "EmailVerificationSubject": "Verify your new account", "Policies": Object { "PasswordPolicy": Object { "MinimumLength": 12, "RequireLowercase": true, "RequireNumbers": true, "RequireSymbols": true, "RequireUppercase": true, }, }, "Schema": Array [ Object { "Mutable": true, "Name": "email", "Required": true, }, ], "SmsVerificationMessage": "The verification code to your new account is {####}", "UserPoolAddOns": Object { "AdvancedSecurityMode": "ENFORCED", }, "UserPoolName": Object { "Fn::Join": Array [ "", Array [ Object { "Ref": "AWS::StackName", }, "-user-pool", ], ], }, "UserPoolTags": Object { "SolutionId": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, "VerificationMessageTemplate": Object { "DefaultEmailOption": "CONFIRM_WITH_CODE", "EmailMessage": "The verification code to your new account is {####}", "EmailSubject": "Verify your new account", "SmsMessage": "The verification code to your new account is {####}", }, }, "Type": "AWS::Cognito::UserPool", "UpdateReplacePolicy": "Delete", }, "DLTCognitoAuthIoTPolicyB8FDFE53": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W11", "reason": "Cannot specify the resource to attach policy to identity", }, ], }, }, "Properties": Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": "iot:Connect", "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":iot:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":client/*", ], ], }, }, Object { "Action": "iot:Subscribe", "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":iot:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":topicfilter/*", ], ], }, }, Object { "Action": "iot:Receive", "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":iot:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":topic/*", ], ], }, }, ], "Version": "2012-10-17", }, }, "Type": "AWS::IoT::Policy", }, "DLTCommonResourcesCloudWatchLogsPolicyB29337B0": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": Array [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", ], "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":logs:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":log-group:/aws/lambda/*", ], ], }, }, ], "Version": "2012-10-17", }, "PolicyName": "DLTCommonResourcesCloudWatchLogsPolicyB29337B0", "Roles": Array [ Object { "Ref": "DLTCustomResourceInfraCustomResourceLambdaRoleCC09066C", }, Object { "Ref": "DLTEcsDLTTaskExecutionRoleDE668717", }, Object { "Ref": "RealTimeDatarealTimeDataPublisherRoleA8976D01", }, Object { "Ref": "DLTLambdaFunctionLambdaResultsRole2CF2D707", }, Object { "Ref": "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD", }, Object { "Ref": "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF", }, Object { "Ref": "DLTLambdaFunctionTaskStatusRole9288E645", }, Object { "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4", }, ], }, "Type": "AWS::IAM::Policy", }, "DLTCommonResourcesLogsBucket48A2774D": Object { "DeletionPolicy": "Retain", "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W35", "reason": "This is the logging bucket, it does not require logging.", }, Object { "id": "W51", "reason": "Since the bucket does not allow the public access, it does not require to have bucket policy.", }, ], }, }, "Properties": Object { "AccessControl": "LogDeliveryWrite", "BucketEncryption": Object { "ServerSideEncryptionConfiguration": Array [ Object { "ServerSideEncryptionByDefault": Object { "SSEAlgorithm": "AES256", }, }, ], }, "OwnershipControls": Object { "Rules": Array [ Object { "ObjectOwnership": "ObjectWriter", }, ], }, "PublicAccessBlockConfiguration": Object { "BlockPublicAcls": true, "BlockPublicPolicy": true, "IgnorePublicAcls": true, "RestrictPublicBuckets": true, }, "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Retain", }, "DLTCommonResourcesLogsBucketPolicyAA7FFB37": Object { "Properties": Object { "Bucket": Object { "Ref": "DLTCommonResourcesLogsBucket48A2774D", }, "PolicyDocument": Object { "Statement": Array [ Object { "Action": "s3:*", "Condition": Object { "Bool": Object { "aws:SecureTransport": "false", }, }, "Effect": "Deny", "Principal": Object { "AWS": "*", }, "Resource": Array [ Object { "Fn::GetAtt": Array [ "DLTCommonResourcesLogsBucket48A2774D", "Arn", ], }, Object { "Fn::Join": Array [ "", Array [ Object { "Fn::GetAtt": Array [ "DLTCommonResourcesLogsBucket48A2774D", "Arn", ], }, "/*", ], ], }, ], }, ], "Version": "2012-10-17", }, }, "Type": "AWS::S3::BucketPolicy", }, "DLTConsoleResourcesDLTCloudFrontToS3CloudFrontDistribution3EF384B4": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W70", "reason": "Since the distribution uses the CloudFront domain name, CloudFront automatically sets the security policy to TLSv1 regardless of the value of MinimumProtocolVersion", }, ], }, }, "Properties": Object { "DistributionConfig": Object { "Comment": "Website distribution for the Distributed Load Testing solution", "CustomErrorResponses": Array [ Object { "ErrorCode": 403, "ResponseCode": 200, "ResponsePagePath": "/index.html", }, Object { "ErrorCode": 404, "ResponseCode": 200, "ResponsePagePath": "/index.html", }, ], "DefaultCacheBehavior": Object { "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, "TargetOriginId": "DLTStackDLTConsoleResourcesDLTCloudFrontToS3CloudFrontDistributionOrigin1022BE4E8", "ViewerProtocolPolicy": "redirect-to-https", }, "DefaultRootObject": "index.html", "Enabled": true, "HttpVersion": "http2", "IPV6Enabled": true, "Logging": Object { "Bucket": Object { "Fn::GetAtt": Array [ "DLTCommonResourcesLogsBucket48A2774D", "RegionalDomainName", ], }, "Prefix": "cloudfront-logs/", }, "Origins": Array [ Object { "DomainName": Object { "Fn::GetAtt": Array [ "DLTConsoleResourcesDLTCloudFrontToS3S3Bucket4FED8B63", "RegionalDomainName", ], }, "Id": "DLTStackDLTConsoleResourcesDLTCloudFrontToS3CloudFrontDistributionOrigin1022BE4E8", "S3OriginConfig": Object { "OriginAccessIdentity": Object { "Fn::Join": Array [ "", Array [ "origin-access-identity/cloudfront/", Object { "Ref": "DLTConsoleResourcesDLTCloudFrontToS3CloudFrontDistributionOrigin1S3Origin5080EA34", }, ], ], }, }, }, ], }, "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::CloudFront::Distribution", }, "DLTConsoleResourcesDLTCloudFrontToS3CloudFrontDistributionOrigin1S3Origin5080EA34": Object { "Properties": Object { "CloudFrontOriginAccessIdentityConfig": Object { "Comment": "Identity for DLTStackDLTConsoleResourcesDLTCloudFrontToS3CloudFrontDistributionOrigin1022BE4E8", }, }, "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", }, "DLTConsoleResourcesDLTCloudFrontToS3S3Bucket4FED8B63": Object { "DeletionPolicy": "Retain", "Properties": Object { "BucketEncryption": Object { "ServerSideEncryptionConfiguration": Array [ Object { "ServerSideEncryptionByDefault": Object { "SSEAlgorithm": "AES256", }, }, ], }, "LifecycleConfiguration": Object { "Rules": Array [ Object { "NoncurrentVersionTransitions": Array [ Object { "StorageClass": "GLACIER", "TransitionInDays": 90, }, ], "Status": "Enabled", }, ], }, "LoggingConfiguration": Object { "DestinationBucketName": Object { "Ref": "DLTCommonResourcesLogsBucket48A2774D", }, "LogFilePrefix": "console-bucket-access/", }, "PublicAccessBlockConfiguration": Object { "BlockPublicAcls": true, "BlockPublicPolicy": true, "IgnorePublicAcls": true, "RestrictPublicBuckets": true, }, "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], "VersioningConfiguration": Object { "Status": "Enabled", }, }, "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Retain", }, "DLTConsoleResourcesDLTCloudFrontToS3S3BucketPolicyF90397AC": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "F16", "reason": "Public website bucket policy requires a wildcard principal", }, ], }, }, "Properties": Object { "Bucket": Object { "Ref": "DLTConsoleResourcesDLTCloudFrontToS3S3Bucket4FED8B63", }, "PolicyDocument": Object { "Statement": Array [ Object { "Action": "s3:*", "Condition": Object { "Bool": Object { "aws:SecureTransport": "false", }, }, "Effect": "Deny", "Principal": Object { "AWS": "*", }, "Resource": Array [ Object { "Fn::GetAtt": Array [ "DLTConsoleResourcesDLTCloudFrontToS3S3Bucket4FED8B63", "Arn", ], }, Object { "Fn::Join": Array [ "", Array [ Object { "Fn::GetAtt": Array [ "DLTConsoleResourcesDLTCloudFrontToS3S3Bucket4FED8B63", "Arn", ], }, "/*", ], ], }, ], }, Object { "Action": "s3:GetObject", "Effect": "Allow", "Principal": Object { "CanonicalUser": Object { "Fn::GetAtt": Array [ "DLTConsoleResourcesDLTCloudFrontToS3CloudFrontDistributionOrigin1S3Origin5080EA34", "S3CanonicalUserId", ], }, }, "Resource": Object { "Fn::Join": Array [ "", Array [ Object { "Fn::GetAtt": Array [ "DLTConsoleResourcesDLTCloudFrontToS3S3Bucket4FED8B63", "Arn", ], }, "/*", ], ], }, }, ], "Version": "2012-10-17", }, }, "Type": "AWS::S3::BucketPolicy", }, "DLTCustomResourceInfraCustomResourceLambdaA4053269": Object { "DependsOn": Array [ "DLTCustomResourceInfraCustomResourceLambdaRoleDefaultPolicyE011C696", "DLTCustomResourceInfraCustomResourceLambdaRoleCC09066C", ], "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W58", "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs.", }, Object { "id": "W89", "reason": "VPC not needed for lambda", }, Object { "id": "W92", "reason": "Does not run concurrent executions", }, ], }, }, "Properties": Object { "Code": Object { "S3Bucket": Object { "Fn::Join": Array [ "-", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "S3Bucket", ], }, Object { "Ref": "AWS::Region", }, ], ], }, "S3Key": Object { "Fn::Join": Array [ "", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "KeyPrefix", ], }, "/main-custom-resource.zip", ], ], }, }, "Description": "CFN Lambda backed custom resource to deploy assets to s3", "Environment": Object { "Variables": Object { "DDB_TABLE": Object { "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A", }, "MAIN_REGION": Object { "Ref": "AWS::Region", }, "METRIC_URL": Object { "Fn::FindInMap": Array [ "Solution", "Config", "URL", ], }, "S3_BUCKET": Object { "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21", }, "SOLUTION_ID": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, "VERSION": Object { "Fn::FindInMap": Array [ "Solution", "Config", "CodeVersion", ], }, }, }, "Handler": "index.handler", "Role": Object { "Fn::GetAtt": Array [ "DLTCustomResourceInfraCustomResourceLambdaRoleCC09066C", "Arn", ], }, "Runtime": "nodejs16.x", "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], "Timeout": 120, }, "Type": "AWS::Lambda::Function", }, "DLTCustomResourceInfraCustomResourceLambdaRoleCC09066C": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W11", "reason": "iot:DescribeEndpoint and iot:DetachPrincipalPolicy cannot specify the resource.", }, ], }, }, "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ Object { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": Object { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, "Policies": Array [ Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": "s3:GetObject", "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":s3:::", Object { "Fn::Join": Array [ "-", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "S3Bucket", ], }, Object { "Ref": "AWS::Region", }, ], ], }, "/*", ], ], }, }, Object { "Action": Array [ "s3:PutObject", "s3:DeleteObject", ], "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":s3:::", Object { "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21", }, "/*", ], ], }, }, Object { "Action": Array [ "dynamodb:PutItem", "dynamodb:DeleteItem", ], "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":dynamodb:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":table/", Object { "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A", }, ], ], }, }, Object { "Action": Array [ "iot:DescribeEndpoint", "iot:DetachPrincipalPolicy", ], "Effect": "Allow", "Resource": "*", }, Object { "Action": "iot:ListTargetsForPolicy", "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":iot:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":policy/*", ], ], }, }, ], "Version": "2012-10-17", }, "PolicyName": "CustomResourcePolicy", }, ], "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::IAM::Role", }, "DLTCustomResourceInfraCustomResourceLambdaRoleDefaultPolicyE011C696": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": "s3:PutObject", "Effect": "Allow", "Resource": Array [ Object { "Fn::GetAtt": Array [ "DLTConsoleResourcesDLTCloudFrontToS3S3Bucket4FED8B63", "Arn", ], }, Object { "Fn::Join": Array [ "", Array [ Object { "Fn::GetAtt": Array [ "DLTConsoleResourcesDLTCloudFrontToS3S3Bucket4FED8B63", "Arn", ], }, "/*", ], ], }, ], }, ], "Version": "2012-10-17", }, "PolicyName": "DLTCustomResourceInfraCustomResourceLambdaRoleDefaultPolicyE011C696", "Roles": Array [ Object { "Ref": "DLTCustomResourceInfraCustomResourceLambdaRoleCC09066C", }, ], }, "Type": "AWS::IAM::Policy", }, "DLTCustomResourcesAnonymousMetricE30E46B4": Object { "Condition": "SendAnonymousUsage", "DeletionPolicy": "Delete", "Properties": Object { "Region": Object { "Ref": "AWS::Region", }, "Resource": "AnonymousMetric", "ServiceToken": Object { "Fn::GetAtt": Array [ "DLTCustomResourceInfraCustomResourceLambdaA4053269", "Arn", ], }, "SolutionId": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, "UUID": Object { "Fn::GetAtt": Array [ "DLTCustomResourcesCustomResourceUuidD1C03F15", "UUID", ], }, "VERSION": Object { "Fn::FindInMap": Array [ "Solution", "Config", "CodeVersion", ], }, "existingVPC": Object { "Fn::If": Array [ "BoolExistingVPC", true, false, ], }, }, "Type": "AWS::CloudFormation::CustomResource", "UpdateReplacePolicy": "Delete", }, "DLTCustomResourcesConsoleConfig9F494EAB": Object { "DeletionPolicy": "Delete", "Properties": Object { "AwsExports": Object { "Fn::Join": Array [ "", Array [ "const awsConfig = { aws_iot_endpoint: '", Object { "Fn::GetAtt": Array [ "DLTCustomResourcesGetIotEndpoint700ABCC8", "IOT_ENDPOINT", ], }, "', aws_iot_policy_name: '", Object { "Ref": "DLTCognitoAuthIoTPolicyB8FDFE53", }, "', cw_dashboard: 'https://console.aws.amazon.com/cloudwatch/home?region=", Object { "Ref": "AWS::Region", }, "#dashboards:', ecs_dashboard: 'https://", Object { "Ref": "AWS::Region", }, ".console.aws.amazon.com/ecs/home?region=", Object { "Ref": "AWS::Region", }, "#/clusters/", Object { "Ref": "AWS::StackName", }, "/tasks', aws_project_region: '", Object { "Ref": "AWS::Region", }, "', aws_cognito_region: '", Object { "Ref": "AWS::Region", }, "', aws_cognito_identity_pool_id: '", Object { "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F", }, "', aws_user_pools_id: '", Object { "Ref": "DLTCognitoAuthDLTUserPoolFA41A712", }, "', aws_user_pools_web_client_id: '", Object { "Ref": "DLTCognitoAuthDLTUserPoolClientA2F8B2DB", }, "', oauth: {}, aws_cloud_logic_custom: [ { name: 'dlts', endpoint: 'https://", Object { "Ref": "DLTApi0C903EB5", }, ".execute-api.", Object { "Ref": "AWS::Region", }, ".", Object { "Ref": "AWS::URLSuffix", }, "/", Object { "Ref": "DLTApiDeploymentStageprodC81F8DCB", }, "', region: '", Object { "Ref": "AWS::Region", }, "' } ], aws_user_files_s3_bucket: '", Object { "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21", }, "', aws_user_files_s3_bucket_region: '", Object { "Ref": "AWS::Region", }, "', }", ], ], }, "DestBucket": Object { "Ref": "DLTConsoleResourcesDLTCloudFrontToS3S3Bucket4FED8B63", }, "Resource": "ConfigFile", "ServiceToken": Object { "Fn::GetAtt": Array [ "DLTCustomResourceInfraCustomResourceLambdaA4053269", "Arn", ], }, }, "Type": "AWS::CloudFormation::CustomResource", "UpdateReplacePolicy": "Delete", }, "DLTCustomResourcesCopyConsoleFiles2EBD447E": Object { "DeletionPolicy": "Delete", "Properties": Object { "DestBucket": Object { "Ref": "DLTConsoleResourcesDLTCloudFrontToS3S3Bucket4FED8B63", }, "ManifestFile": "console-manifest.json", "Resource": "CopyAssets", "ServiceToken": Object { "Fn::GetAtt": Array [ "DLTCustomResourceInfraCustomResourceLambdaA4053269", "Arn", ], }, "SrcBucket": Object { "Fn::Join": Array [ "-", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "S3Bucket", ], }, Object { "Ref": "AWS::Region", }, ], ], }, "SrcPath": Object { "Fn::Join": Array [ "", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "KeyPrefix", ], }, "/console", ], ], }, }, "Type": "AWS::CloudFormation::CustomResource", "UpdateReplacePolicy": "Delete", }, "DLTCustomResourcesCustomResourceUuidD1C03F15": Object { "DeletionPolicy": "Delete", "Properties": Object { "Resource": "UUID", "ServiceToken": Object { "Fn::GetAtt": Array [ "DLTCustomResourceInfraCustomResourceLambdaA4053269", "Arn", ], }, }, "Type": "AWS::CloudFormation::CustomResource", "UpdateReplacePolicy": "Delete", }, "DLTCustomResourcesDetachIotPrincipalPolicyE4A7C1B8": Object { "DeletionPolicy": "Delete", "Properties": Object { "IotPolicyName": Object { "Ref": "DLTCognitoAuthIoTPolicyB8FDFE53", }, "Resource": "DetachIotPolicy", "ServiceToken": Object { "Fn::GetAtt": Array [ "DLTCustomResourceInfraCustomResourceLambdaA4053269", "Arn", ], }, }, "Type": "AWS::CloudFormation::CustomResource", "UpdateReplacePolicy": "Delete", }, "DLTCustomResourcesGetIotEndpoint700ABCC8": Object { "DeletionPolicy": "Delete", "Properties": Object { "Resource": "GetIotEndpoint", "ServiceToken": Object { "Fn::GetAtt": Array [ "DLTCustomResourceInfraCustomResourceLambdaA4053269", "Arn", ], }, }, "Type": "AWS::CloudFormation::CustomResource", "UpdateReplacePolicy": "Delete", }, "DLTCustomResourcesPutRegionalTemplate5479575B": Object { "DeletionPolicy": "Delete", "Properties": Object { "APIServicesLambdaRoleName": Object { "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4", }, "DestBucket": Object { "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21", }, "MainStackRegion": Object { "Ref": "AWS::Region", }, "Resource": "PutRegionalTemplate", "ResultsParserRoleName": Object { "Ref": "DLTLambdaFunctionLambdaResultsRole2CF2D707", }, "ScenariosTable": Object { "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A", }, "ServiceToken": Object { "Fn::GetAtt": Array [ "DLTCustomResourceInfraCustomResourceLambdaA4053269", "Arn", ], }, "SrcBucket": Object { "Fn::Join": Array [ "-", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "S3Bucket", ], }, Object { "Ref": "AWS::Region", }, ], ], }, "SrcPath": Object { "Fn::FindInMap": Array [ "Solution", "Config", "KeyPrefix", ], }, "TaskCancelerRoleName": Object { "Ref": "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF", }, "TaskRunnerRoleName": Object { "Ref": "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD", }, "TaskStatusCheckerRoleName": Object { "Ref": "DLTLambdaFunctionTaskStatusRole9288E645", }, "Uuid": Object { "Fn::GetAtt": Array [ "DLTCustomResourcesCustomResourceUuidD1C03F15", "UUID", ], }, }, "Type": "AWS::CloudFormation::CustomResource", "UpdateReplacePolicy": "Delete", }, "DLTCustomResourcesTestingResourcesConfig0BCA657F": Object { "DeletionPolicy": "Delete", "Properties": Object { "Resource": "TestingResourcesConfigFile", "ServiceToken": Object { "Fn::GetAtt": Array [ "DLTCustomResourceInfraCustomResourceLambdaA4053269", "Arn", ], }, "TestingResourcesConfig": Object { "ecsCloudWatchLogGroup": Object { "Ref": "DLTEcsDLTCloudWatchLogsGroupFE9EC144", }, "region": Object { "Ref": "AWS::Region", }, "subnetA": Object { "Fn::If": Array [ "CreateFargateVPCResources", Object { "Ref": "DLTVpcDLTSubnetAAE7DDEE8", }, Object { "Ref": "ExistingSubnetA", }, ], }, "subnetB": Object { "Fn::If": Array [ "CreateFargateVPCResources", Object { "Ref": "DLTVpcDLTSubnetB294F4ED2", }, Object { "Ref": "ExistingSubnetB", }, ], }, "taskCluster": Object { "Ref": "DLTEcsDLTEcsClusterBC5CE23B", }, "taskDefinition": Object { "Ref": "DLTEcsDLTTaskDefinition6BFC2400", }, "taskImage": Object { "Fn::Join": Array [ "", Array [ Object { "Ref": "AWS::StackName", }, "-load-tester", ], ], }, "taskSecurityGroup": Object { "Ref": "DLTEcsDLTEcsSecurityGroup69E6743C", }, }, "Uuid": Object { "Fn::GetAtt": Array [ "DLTCustomResourcesCustomResourceUuidD1C03F15", "UUID", ], }, }, "Type": "AWS::CloudFormation::CustomResource", "UpdateReplacePolicy": "Delete", }, "DLTEcsDLTCloudWatchLogsGroupECSLogSubscriptionFilterC5BB4DB5": Object { "DependsOn": Array [ "DLTEcsDLTCloudWatchLogsGroupECSLogSubscriptionFilterCanInvokeLambdaF6EFF73B", ], "Properties": Object { "DestinationArn": Object { "Fn::GetAtt": Array [ "RealTimeDataRealTimeDataPublisher7E8F8F6C", "Arn", ], }, "FilterPattern": "\\"INFO: Current:\\" \\"live=true\\"", "LogGroupName": Object { "Ref": "DLTEcsDLTCloudWatchLogsGroupFE9EC144", }, }, "Type": "AWS::Logs::SubscriptionFilter", }, "DLTEcsDLTCloudWatchLogsGroupECSLogSubscriptionFilterCanInvokeLambdaF6EFF73B": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ "RealTimeDataRealTimeDataPublisher7E8F8F6C", "Arn", ], }, "Principal": "logs.amazonaws.com", "SourceArn": Object { "Fn::GetAtt": Array [ "DLTEcsDLTCloudWatchLogsGroupFE9EC144", "Arn", ], }, }, "Type": "AWS::Lambda::Permission", }, "DLTEcsDLTCloudWatchLogsGroupFE9EC144": Object { "DeletionPolicy": "Retain", "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W84", "reason": "KMS encryption unnecessary for log group", }, ], }, }, "Properties": Object { "RetentionInDays": 365, "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Retain", }, "DLTEcsDLTEcsClusterBC5CE23B": Object { "Properties": Object { "ClusterName": Object { "Ref": "AWS::StackName", }, "ClusterSettings": Array [ Object { "Name": "containerInsights", "Value": "enabled", }, ], "Tags": Array [ Object { "Key": "CloudFormation Stack", "Value": Object { "Ref": "AWS::StackName", }, }, Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::ECS::Cluster", }, "DLTEcsDLTEcsSecurityGroup69E6743C": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W40", "reason": "IpProtocol set to -1 (any) as ports are not known prior to running tests", }, ], }, }, "Properties": Object { "GroupDescription": "DLTS Tasks Security Group", "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], "VpcId": Object { "Fn::If": Array [ "CreateFargateVPCResources", Object { "Ref": "DLTVpcDLTFargateVpc0E6FEAB7", }, Object { "Ref": "ExistingVPCId", }, ], }, }, "Type": "AWS::EC2::SecurityGroup", }, "DLTEcsDLTSecGroupEgressE1DA93E8": Object { "Properties": Object { "CidrIp": Object { "Ref": "EgressCidr", }, "Description": "Allow tasks to call out to external resources", "GroupId": Object { "Ref": "DLTEcsDLTEcsSecurityGroup69E6743C", }, "IpProtocol": "-1", }, "Type": "AWS::EC2::SecurityGroupEgress", }, "DLTEcsDLTSecGroupIngressFA958E66": Object { "Properties": Object { "Description": "Allow tasks to communicate", "FromPort": 50000, "GroupId": Object { "Ref": "DLTEcsDLTEcsSecurityGroup69E6743C", }, "IpProtocol": "tcp", "SourceSecurityGroupId": Object { "Ref": "DLTEcsDLTEcsSecurityGroup69E6743C", }, "ToPort": 50000, }, "Type": "AWS::EC2::SecurityGroupIngress", }, "DLTEcsDLTTaskDefinition6BFC2400": Object { "Properties": Object { "ContainerDefinitions": Array [ Object { "Essential": true, "Image": Object { "Fn::FindInMap": Array [ "Solution", "Config", "ContainerImage", ], }, "LogConfiguration": Object { "LogDriver": "awslogs", "Options": Object { "awslogs-group": Object { "Ref": "DLTEcsDLTCloudWatchLogsGroupFE9EC144", }, "awslogs-region": Object { "Ref": "AWS::Region", }, "awslogs-stream-prefix": "load-testing", }, }, "Memory": 4096, "Name": Object { "Fn::Join": Array [ "", Array [ Object { "Ref": "AWS::StackName", }, "-load-tester", ], ], }, }, ], "Cpu": "2048", "ExecutionRoleArn": Object { "Fn::GetAtt": Array [ "DLTEcsDLTTaskExecutionRoleDE668717", "Arn", ], }, "Memory": "4096", "NetworkMode": "awsvpc", "RequiresCompatibilities": Array [ "FARGATE", ], "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], "TaskRoleArn": Object { "Fn::GetAtt": Array [ "DLTEcsDLTTaskExecutionRoleDE668717", "Arn", ], }, }, "Type": "AWS::ECS::TaskDefinition", }, "DLTEcsDLTTaskExecutionRoleDE668717": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ Object { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": Object { "Service": "ecs-tasks.amazonaws.com", }, }, ], "Version": "2012-10-17", }, "ManagedPolicyArns": Array [ Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy", ], ], }, ], "Policies": Array [ Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": Array [ "s3:HeadObject", "s3:PutObject", "s3:GetObject", "s3:ListBucket", ], "Effect": "Allow", "Resource": Array [ Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":s3:::", Object { "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21", }, ], ], }, Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":s3:::", Object { "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21", }, "/*", ], ], }, ], }, ], "Version": "2012-10-17", }, "PolicyName": "ScenariosS3Policy", }, ], "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::IAM::Role", }, "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W11", "reason": "ecs:ListTasks does not support resource level permissions", }, ], }, }, "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ Object { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": Object { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, "Policies": Array [ Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": "ecs:ListTasks", "Effect": "Allow", "Resource": "*", }, Object { "Action": Array [ "ecs:RunTask", "ecs:DescribeTasks", ], "Effect": "Allow", "Resource": Array [ Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":ecs:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":task/*", ], ], }, Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":ecs:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":task-definition/*:*", ], ], }, ], }, Object { "Action": "iam:PassRole", "Effect": "Allow", "Resource": Object { "Fn::GetAtt": Array [ "DLTEcsDLTTaskExecutionRoleDE668717", "Arn", ], }, }, Object { "Action": "logs:PutMetricFilter", "Effect": "Allow", "Resource": Object { "Fn::GetAtt": Array [ "DLTEcsDLTCloudWatchLogsGroupFE9EC144", "Arn", ], }, }, Object { "Action": "cloudwatch:PutDashboard", "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":cloudwatch::", Object { "Ref": "AWS::AccountId", }, ":dashboard/EcsLoadTesting*", ], ], }, }, ], "Version": "2012-10-17", }, "PolicyName": "TaskLambdaPolicy", }, ], "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::IAM::Role", }, "DLTLambdaFunctionLambdaResultsPolicyB191FC35": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W12", "reason": "The action does not support resource level permissions.", }, ], }, }, "Properties": Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": "cloudwatch:GetMetricWidgetImage", "Effect": "Allow", "Resource": "*", }, Object { "Action": "logs:DeleteMetricFilter", "Effect": "Allow", "Resource": Object { "Fn::GetAtt": Array [ "DLTEcsDLTCloudWatchLogsGroupFE9EC144", "Arn", ], }, }, ], "Version": "2012-10-17", }, "PolicyName": "DLTLambdaFunctionLambdaResultsPolicyB191FC35", "Roles": Array [ Object { "Ref": "DLTLambdaFunctionLambdaResultsRole2CF2D707", }, ], }, "Type": "AWS::IAM::Policy", }, "DLTLambdaFunctionLambdaResultsRole2CF2D707": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W12", "reason": "The action does not support resource level permissions.", }, ], }, }, "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ Object { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": Object { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::IAM::Role", }, "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W11", "reason": "ecs:ListTasks does not support resource level permissions", }, ], }, }, "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ Object { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": Object { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, "Policies": Array [ Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": "ecs:ListTasks", "Effect": "Allow", "Resource": "*", }, Object { "Action": "ecs:StopTask", "Effect": "Allow", "Resource": Array [ Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":ecs:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":task/*", ], ], }, Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":ecs:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":task-definition/*:*", ], ], }, ], }, Object { "Action": "dynamodb:UpdateItem", "Effect": "Allow", "Resource": Object { "Fn::GetAtt": Array [ "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A", "Arn", ], }, }, ], "Version": "2012-10-17", }, "PolicyName": "TaskCancelerPolicy", }, ], "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::IAM::Role", }, "DLTLambdaFunctionResultsParserFF5CC920": Object { "DependsOn": Array [ "DLTLambdaFunctionLambdaResultsRole2CF2D707", ], "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W58", "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs.", }, Object { "id": "W89", "reason": "This Lambda function does not require a VPC", }, Object { "id": "W92", "reason": "Does not run concurrent executions", }, ], }, }, "Properties": Object { "Code": Object { "S3Bucket": Object { "Fn::Join": Array [ "-", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "S3Bucket", ], }, Object { "Ref": "AWS::Region", }, ], ], }, "S3Key": Object { "Fn::Join": Array [ "", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "KeyPrefix", ], }, "/results-parser.zip", ], ], }, }, "Description": "Result parser for indexing xml test results to DynamoDB", "Environment": Object { "Variables": Object { "HISTORY_TABLE": Object { "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC", }, "METRIC_URL": Object { "Fn::FindInMap": Array [ "Solution", "Config", "URL", ], }, "SCENARIOS_BUCKET": Object { "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21", }, "SCENARIOS_TABLE": Object { "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A", }, "SEND_METRIC": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SendAnonymousUsage", ], }, "SOLUTION_ID": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, "UUID": Object { "Fn::GetAtt": Array [ "DLTCustomResourcesCustomResourceUuidD1C03F15", "UUID", ], }, "VERSION": Object { "Fn::FindInMap": Array [ "Solution", "Config", "CodeVersion", ], }, }, }, "Handler": "index.handler", "Role": Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionLambdaResultsRole2CF2D707", "Arn", ], }, "Runtime": "nodejs16.x", "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], "Timeout": 120, }, "Type": "AWS::Lambda::Function", }, "DLTLambdaFunctionTaskCanceler4E12BDA6": Object { "DependsOn": Array [ "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF", ], "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W58", "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs.", }, Object { "id": "W89", "reason": "This Lambda function does not require a VPC", }, Object { "id": "W92", "reason": "Does not run concurrent executions", }, ], }, }, "Properties": Object { "Code": Object { "S3Bucket": Object { "Fn::Join": Array [ "-", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "S3Bucket", ], }, Object { "Ref": "AWS::Region", }, ], ], }, "S3Key": Object { "Fn::Join": Array [ "", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "KeyPrefix", ], }, "/task-canceler.zip", ], ], }, }, "Description": "Stops ECS task", "Environment": Object { "Variables": Object { "METRIC_URL": Object { "Fn::FindInMap": Array [ "Solution", "Config", "URL", ], }, "SCENARIOS_TABLE": Object { "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A", }, "SOLUTION_ID": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, "VERSION": Object { "Fn::FindInMap": Array [ "Solution", "Config", "CodeVersion", ], }, }, }, "Handler": "index.handler", "Role": Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF", "Arn", ], }, "Runtime": "nodejs16.x", "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], "Timeout": 300, }, "Type": "AWS::Lambda::Function", }, "DLTLambdaFunctionTaskCancelerInvokePolicyA1C7562A": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": "lambda:InvokeFunction", "Effect": "Allow", "Resource": Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskCanceler4E12BDA6", "Arn", ], }, }, ], "Version": "2012-10-17", }, "PolicyName": "DLTLambdaFunctionTaskCancelerInvokePolicyA1C7562A", "Roles": Array [ Object { "Ref": "DLTLambdaFunctionTaskStatusRole9288E645", }, Object { "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4", }, ], }, "Type": "AWS::IAM::Policy", }, "DLTLambdaFunctionTaskRunnerAAAD9171": Object { "DependsOn": Array [ "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD", ], "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W58", "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs.", }, Object { "id": "W89", "reason": "This Lambda function does not require a VPC", }, Object { "id": "W92", "reason": "Does not run concurrent executions", }, ], }, }, "Properties": Object { "Code": Object { "S3Bucket": Object { "Fn::Join": Array [ "-", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "S3Bucket", ], }, Object { "Ref": "AWS::Region", }, ], ], }, "S3Key": Object { "Fn::Join": Array [ "", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "KeyPrefix", ], }, "/task-runner.zip", ], ], }, }, "Description": "Task runner for ECS task definitions", "Environment": Object { "Variables": Object { "SCENARIOS_BUCKET": Object { "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21", }, "SCENARIOS_TABLE": Object { "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A", }, "SOLUTION_ID": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, "VERSION": Object { "Fn::FindInMap": Array [ "Solution", "Config", "CodeVersion", ], }, }, }, "Handler": "index.handler", "Role": Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD", "Arn", ], }, "Runtime": "nodejs16.x", "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], "Timeout": 900, }, "Type": "AWS::Lambda::Function", }, "DLTLambdaFunctionTaskStatusChecker1AA63EC9": Object { "DependsOn": Array [ "DLTLambdaFunctionTaskStatusRole9288E645", ], "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W58", "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs.", }, Object { "id": "W89", "reason": "This Lambda function does not require a VPC", }, Object { "id": "W92", "reason": "Does not run concurrent executions", }, ], }, }, "Properties": Object { "Code": Object { "S3Bucket": Object { "Fn::Join": Array [ "-", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "S3Bucket", ], }, Object { "Ref": "AWS::Region", }, ], ], }, "S3Key": Object { "Fn::Join": Array [ "", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "KeyPrefix", ], }, "/task-status-checker.zip", ], ], }, }, "Description": "Task status checker", "Environment": Object { "Variables": Object { "SCENARIOS_TABLE": Object { "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A", }, "SOLUTION_ID": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, "TASK_CANCELER_ARN": Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskCanceler4E12BDA6", "Arn", ], }, "VERSION": Object { "Fn::FindInMap": Array [ "Solution", "Config", "CodeVersion", ], }, }, }, "Handler": "index.handler", "Role": Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskStatusRole9288E645", "Arn", ], }, "Runtime": "nodejs16.x", "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], "Timeout": 180, }, "Type": "AWS::Lambda::Function", }, "DLTLambdaFunctionTaskStatusRole9288E645": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W11", "reason": "ecs:ListTasks does not support resource level permissions", }, ], }, }, "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ Object { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": Object { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, "Policies": Array [ Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": "ecs:ListTasks", "Effect": "Allow", "Resource": "*", }, Object { "Action": "ecs:DescribeTasks", "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":ecs:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":task/*", ], ], }, }, ], "Version": "2012-10-17", }, "PolicyName": "TaskStatusPolicy", }, ], "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::IAM::Role", }, "DLTStepFunctionStepFunctionsLogGroup8DABDAB7": Object { "DeletionPolicy": "Retain", "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W84", "reason": "KMS encryption unnecessary for log group", }, ], }, }, "Properties": Object { "LogGroupName": Object { "Fn::Join": Array [ "", Array [ "/aws/vendedlogs/states/StepFunctionsLogGroup", Object { "Ref": "AWS::StackName", }, Object { "Fn::GetAtt": Array [ "DLTCustomResourcesCustomResourceUuidD1C03F15", "SUFFIX", ], }, ], ], }, "RetentionInDays": 365, "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Retain", }, "DLTStepFunctionTaskRunnerStepFunctionsC295A535": Object { "DeletionPolicy": "Delete", "DependsOn": Array [ "DLTStepFunctionTaskRunnerStepFunctionsRoleDefaultPolicy8F17B49F", "DLTStepFunctionTaskRunnerStepFunctionsRoleC2237F06", ], "Properties": Object { "DefinitionString": Object { "Fn::Join": Array [ "", Array [ "{\\"StartAt\\":\\"Regions for testing\\",\\"States\\":{\\"Regions for testing\\":{\\"Type\\":\\"Map\\",\\"ResultPath\\":null,\\"Next\\":\\"Parse result\\",\\"InputPath\\":\\"$\\",\\"Parameters\\":{\\"testTaskConfig.$\\":\\"$$.Map.Item.Value\\",\\"testId.$\\":\\"$.testId\\",\\"testType.$\\":\\"$.testType\\",\\"fileType.$\\":\\"$.fileType\\",\\"showLive.$\\":\\"$.showLive\\",\\"testDuration.$\\":\\"$.testDuration\\",\\"prefix.$\\":\\"$.prefix\\"},\\"Iterator\\":{\\"StartAt\\":\\"Check running tests\\",\\"States\\":{\\"Check running tests\\":{\\"Next\\":\\"No running tests\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Type\\":\\"Task\\",\\"InputPath\\":\\"$\\",\\"OutputPath\\":\\"$.Payload\\",\\"Resource\\":\\"arn:", Object { "Ref": "AWS::Partition", }, ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"", Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskStatusChecker1AA63EC9", "Arn", ], }, "\\",\\"Payload.$\\":\\"$\\"}},\\"No running tests\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Variable\\":\\"$.isRunning\\",\\"BooleanEquals\\":false,\\"Next\\":\\"Run workers\\"}],\\"Default\\":\\"Test is still running\\"},\\"Test is still running\\":{\\"Type\\":\\"Fail\\",\\"Error\\":\\"TestAlreadyRunning\\",\\"Cause\\":\\"The same test is already running.\\"},\\"Run workers\\":{\\"Next\\":\\"Requires leader?\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Type\\":\\"Task\\",\\"InputPath\\":\\"$\\",\\"OutputPath\\":\\"$.Payload\\",\\"Resource\\":\\"arn:", Object { "Ref": "AWS::Partition", }, ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"", Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskRunnerAAAD9171", "Arn", ], }, "\\",\\"Payload.$\\":\\"$\\"}},\\"Requires leader?\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Variable\\":\\"$.isRunning\\",\\"BooleanEquals\\":false,\\"Next\\":\\"Cancel Test\\"},{\\"Variable\\":\\"$.taskIds\\",\\"IsPresent\\":false,\\"Next\\":\\"Wait specified test duration\\"}],\\"Default\\":\\"Wait 1 minute - worker status\\"},\\"Wait 1 minute - worker status\\":{\\"Type\\":\\"Wait\\",\\"Comment\\":\\"Wait 1 minute to check task status again\\",\\"Seconds\\":60,\\"Next\\":\\"Check worker status\\"},\\"Check worker status\\":{\\"Next\\":\\"Are all workers running?\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Type\\":\\"Task\\",\\"InputPath\\":\\"$\\",\\"OutputPath\\":\\"$.Payload\\",\\"Resource\\":\\"arn:", Object { "Ref": "AWS::Partition", }, ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"", Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskStatusChecker1AA63EC9", "Arn", ], }, "\\",\\"Payload.$\\":\\"$\\"}},\\"Are all workers running?\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Variable\\":\\"$.isRunning\\",\\"BooleanEquals\\":false,\\"Next\\":\\"Cancel Test\\"},{\\"Variable\\":\\"$.numTasksRunning\\",\\"NumericEqualsPath\\":\\"$.numTasksTotal\\",\\"Next\\":\\"Run leader task\\"}],\\"Default\\":\\"Wait 1 minute - worker status\\"},\\"Cancel Test\\":{\\"Next\\":\\"Map End\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Type\\":\\"Task\\",\\"InputPath\\":\\"$\\",\\"ResultPath\\":null,\\"Resource\\":\\"arn:", Object { "Ref": "AWS::Partition", }, ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"", Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskCanceler4E12BDA6", "Arn", ], }, "\\",\\"Payload.$\\":\\"$\\"}},\\"Run leader task\\":{\\"Next\\":\\"Wait specified test duration\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.error\\",\\"Next\\":\\"Cancel Test\\"}],\\"Type\\":\\"Task\\",\\"InputPath\\":\\"$\\",\\"OutputPath\\":\\"$.Payload\\",\\"Resource\\":\\"arn:", Object { "Ref": "AWS::Partition", }, ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"", Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskRunnerAAAD9171", "Arn", ], }, "\\",\\"Payload.$\\":\\"$\\"}},\\"Wait specified test duration\\":{\\"Type\\":\\"Wait\\",\\"SecondsPath\\":\\"$.testDuration\\",\\"Next\\":\\"Check task status\\"},\\"Check task status\\":{\\"Next\\":\\"Are all tasks done?\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Type\\":\\"Task\\",\\"InputPath\\":\\"$\\",\\"OutputPath\\":\\"$.Payload\\",\\"Resource\\":\\"arn:", Object { "Ref": "AWS::Partition", }, ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"", Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskStatusChecker1AA63EC9", "Arn", ], }, "\\",\\"Payload.$\\":\\"$\\"}},\\"Wait 1 minute - task status\\":{\\"Type\\":\\"Wait\\",\\"Comment\\":\\"Wait 1 minute to check task status again\\",\\"Seconds\\":60,\\"Next\\":\\"Check task status\\"},\\"Are all tasks done?\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Variable\\":\\"$.isRunning\\",\\"BooleanEquals\\":false,\\"Next\\":\\"Map End\\"}],\\"Default\\":\\"Wait 1 minute - task status\\"},\\"Map End\\":{\\"Type\\":\\"Pass\\",\\"End\\":true}}},\\"ItemsPath\\":\\"$.testTaskConfig\\"},\\"Parse result\\":{\\"Next\\":\\"Done\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", Object { "Ref": "AWS::Partition", }, ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"", Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionResultsParserFF5CC920", "Arn", ], }, "\\",\\"Payload.$\\":\\"$\\"}},\\"Done\\":{\\"Type\\":\\"Succeed\\"}}}", ], ], }, "LoggingConfiguration": Object { "Destinations": Array [ Object { "CloudWatchLogsLogGroup": Object { "LogGroupArn": Object { "Fn::GetAtt": Array [ "DLTStepFunctionStepFunctionsLogGroup8DABDAB7", "Arn", ], }, }, }, ], "IncludeExecutionData": false, "Level": "ALL", }, "RoleArn": Object { "Fn::GetAtt": Array [ "DLTStepFunctionTaskRunnerStepFunctionsRoleC2237F06", "Arn", ], }, "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::StepFunctions::StateMachine", "UpdateReplacePolicy": "Delete", }, "DLTStepFunctionTaskRunnerStepFunctionsRoleC2237F06": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W11", "reason": "CloudWatch logs actions do not support resource level permissions", }, Object { "id": "W12", "reason": "CloudWatch logs actions do not support resource level permissions", }, ], }, }, "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ Object { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": Object { "Service": Object { "Fn::FindInMap": Array [ "ServiceprincipalMap", Object { "Ref": "AWS::Region", }, "states", ], }, }, }, ], "Version": "2012-10-17", }, "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::IAM::Role", }, "DLTStepFunctionTaskRunnerStepFunctionsRoleDefaultPolicy8F17B49F": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W12", "reason": "CloudWatch logs actions do not support resource level permissions", }, Object { "id": "W76", "reason": "The IAM policy is written for least-privilege access.", }, ], }, }, "Properties": Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": Array [ "logs:CreateLogDelivery", "logs:GetLogDelivery", "logs:UpdateLogDelivery", "logs:DeleteLogDelivery", "logs:ListLogDeliveries", "logs:PutResourcePolicy", "logs:DescribeResourcePolicies", "logs:DescribeLogGroups", ], "Effect": "Allow", "Resource": "*", }, Object { "Action": "lambda:InvokeFunction", "Effect": "Allow", "Resource": Array [ Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionResultsParserFF5CC920", "Arn", ], }, Object { "Fn::Join": Array [ "", Array [ Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionResultsParserFF5CC920", "Arn", ], }, ":*", ], ], }, ], }, Object { "Action": "lambda:InvokeFunction", "Effect": "Allow", "Resource": Array [ Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskStatusChecker1AA63EC9", "Arn", ], }, Object { "Fn::Join": Array [ "", Array [ Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskStatusChecker1AA63EC9", "Arn", ], }, ":*", ], ], }, ], }, Object { "Action": "lambda:InvokeFunction", "Effect": "Allow", "Resource": Array [ Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskRunnerAAAD9171", "Arn", ], }, Object { "Fn::Join": Array [ "", Array [ Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskRunnerAAAD9171", "Arn", ], }, ":*", ], ], }, ], }, Object { "Action": "lambda:InvokeFunction", "Effect": "Allow", "Resource": Array [ Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskCanceler4E12BDA6", "Arn", ], }, Object { "Fn::Join": Array [ "", Array [ Object { "Fn::GetAtt": Array [ "DLTLambdaFunctionTaskCanceler4E12BDA6", "Arn", ], }, ":*", ], ], }, ], }, ], "Version": "2012-10-17", }, "PolicyName": "DLTStepFunctionTaskRunnerStepFunctionsRoleDefaultPolicy8F17B49F", "Roles": Array [ Object { "Ref": "DLTStepFunctionTaskRunnerStepFunctionsRoleC2237F06", }, ], }, "Type": "AWS::IAM::Policy", }, "DLTTestRunnerStorageDLTHistoryTable46D850CC": Object { "DeletionPolicy": "Retain", "Properties": Object { "AttributeDefinitions": Array [ Object { "AttributeName": "testId", "AttributeType": "S", }, Object { "AttributeName": "testRunId", "AttributeType": "S", }, ], "BillingMode": "PAY_PER_REQUEST", "KeySchema": Array [ Object { "AttributeName": "testId", "KeyType": "HASH", }, Object { "AttributeName": "testRunId", "KeyType": "RANGE", }, ], "PointInTimeRecoverySpecification": Object { "PointInTimeRecoveryEnabled": true, }, "SSESpecification": Object { "SSEEnabled": true, }, "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::DynamoDB::Table", "UpdateReplacePolicy": "Retain", }, "DLTTestRunnerStorageDLTScenariosBucketA9290D21": Object { "DeletionPolicy": "Retain", "Properties": Object { "BucketEncryption": Object { "ServerSideEncryptionConfiguration": Array [ Object { "ServerSideEncryptionByDefault": Object { "SSEAlgorithm": "aws:kms", }, }, ], }, "CorsConfiguration": Object { "CorsRules": Array [ Object { "AllowedHeaders": Array [ "*", ], "AllowedMethods": Array [ "GET", "POST", "PUT", ], "AllowedOrigins": Array [ Object { "Fn::Join": Array [ "", Array [ "https://", Object { "Fn::GetAtt": Array [ "DLTConsoleResourcesDLTCloudFrontToS3CloudFrontDistribution3EF384B4", "DomainName", ], }, ], ], }, ], "ExposedHeaders": Array [ "ETag", ], }, ], }, "LoggingConfiguration": Object { "DestinationBucketName": Object { "Ref": "DLTCommonResourcesLogsBucket48A2774D", }, "LogFilePrefix": "scenarios-bucket-access/", }, "PublicAccessBlockConfiguration": Object { "BlockPublicAcls": true, "BlockPublicPolicy": true, "IgnorePublicAcls": true, "RestrictPublicBuckets": true, }, "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Retain", }, "DLTTestRunnerStorageDLTScenariosBucketPolicy96221788": Object { "Properties": Object { "Bucket": Object { "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21", }, "PolicyDocument": Object { "Statement": Array [ Object { "Action": "s3:*", "Condition": Object { "Bool": Object { "aws:SecureTransport": false, }, }, "Effect": "Deny", "Principal": Object { "AWS": "*", }, "Resource": Array [ Object { "Fn::GetAtt": Array [ "DLTTestRunnerStorageDLTScenariosBucketA9290D21", "Arn", ], }, Object { "Fn::Join": Array [ "", Array [ Object { "Fn::GetAtt": Array [ "DLTTestRunnerStorageDLTScenariosBucketA9290D21", "Arn", ], }, "/*", ], ], }, ], }, ], "Version": "2012-10-17", }, }, "Type": "AWS::S3::BucketPolicy", }, "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A": Object { "DeletionPolicy": "Retain", "Properties": Object { "AttributeDefinitions": Array [ Object { "AttributeName": "testId", "AttributeType": "S", }, ], "BillingMode": "PAY_PER_REQUEST", "KeySchema": Array [ Object { "AttributeName": "testId", "KeyType": "HASH", }, ], "PointInTimeRecoverySpecification": Object { "PointInTimeRecoveryEnabled": true, }, "SSESpecification": Object { "SSEEnabled": true, }, "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::DynamoDB::Table", "UpdateReplacePolicy": "Retain", }, "DLTTestRunnerStorageHistoryDynamoDbPolicyA439CB46": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": Array [ "dynamodb:BatchWriteItem", "dynamodb:PutItem", "dynamodb:Query", ], "Effect": "Allow", "Resource": Object { "Fn::GetAtt": Array [ "DLTTestRunnerStorageDLTHistoryTable46D850CC", "Arn", ], }, }, ], "Version": "2012-10-17", }, "PolicyName": "DLTTestRunnerStorageHistoryDynamoDbPolicyA439CB46", "Roles": Array [ Object { "Ref": "DLTLambdaFunctionLambdaResultsRole2CF2D707", }, Object { "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4", }, ], }, "Type": "AWS::IAM::Policy", }, "DLTTestRunnerStorageScenarioDynamoDbPolicy8B391249": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": Array [ "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Scan", "dynamodb:UpdateItem", ], "Effect": "Allow", "Resource": Object { "Fn::GetAtt": Array [ "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A", "Arn", ], }, }, ], "Version": "2012-10-17", }, "PolicyName": "DLTTestRunnerStorageScenarioDynamoDbPolicy8B391249", "Roles": Array [ Object { "Ref": "DLTLambdaFunctionLambdaResultsRole2CF2D707", }, Object { "Ref": "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD", }, Object { "Ref": "DLTLambdaFunctionTaskStatusRole9288E645", }, Object { "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4", }, ], }, "Type": "AWS::IAM::Policy", }, "DLTTestRunnerStorageScenariosS3PolicyD20D3673": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": Array [ "s3:HeadObject", "s3:PutObject", "s3:GetObject", "s3:ListBucket", ], "Effect": "Allow", "Resource": Array [ Object { "Fn::GetAtt": Array [ "DLTTestRunnerStorageDLTScenariosBucketA9290D21", "Arn", ], }, Object { "Fn::Join": Array [ "", Array [ Object { "Fn::GetAtt": Array [ "DLTTestRunnerStorageDLTScenariosBucketA9290D21", "Arn", ], }, "/*", ], ], }, ], }, ], "Version": "2012-10-17", }, "PolicyName": "DLTTestRunnerStorageScenariosS3PolicyD20D3673", "Roles": Array [ Object { "Ref": "DLTLambdaFunctionLambdaResultsRole2CF2D707", }, Object { "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4", }, ], }, "Type": "AWS::IAM::Policy", }, "DLTVpcDLTFargateIG0E71BA5C": Object { "Condition": "CreateFargateVPCResources", "Properties": Object { "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::EC2::InternetGateway", }, "DLTVpcDLTFargateRT86406464": Object { "Condition": "CreateFargateVPCResources", "Properties": Object { "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], "VpcId": Object { "Ref": "DLTVpcDLTFargateVpc0E6FEAB7", }, }, "Type": "AWS::EC2::RouteTable", }, "DLTVpcDLTFargateVpc0E6FEAB7": Object { "Condition": "CreateFargateVPCResources", "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W60", "reason": "This VPC is used for the test runner Fargate tasks only, it does not require VPC flow logs.", }, ], }, }, "Properties": Object { "CidrBlock": Object { "Ref": "VpcCidrBlock", }, "EnableDnsHostnames": true, "EnableDnsSupport": true, "Tags": Array [ Object { "Key": "Name", "Value": Object { "Ref": "AWS::StackName", }, }, Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::EC2::VPC", }, "DLTVpcDLTGatewayattachment220D400F": Object { "Condition": "CreateFargateVPCResources", "Properties": Object { "InternetGatewayId": Object { "Ref": "DLTVpcDLTFargateIG0E71BA5C", }, "VpcId": Object { "Ref": "DLTVpcDLTFargateVpc0E6FEAB7", }, }, "Type": "AWS::EC2::VPCGatewayAttachment", }, "DLTVpcDLTRouteF8F2A836": Object { "Condition": "CreateFargateVPCResources", "DependsOn": Array [ "DLTVpcDLTGatewayattachment220D400F", ], "Properties": Object { "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": Object { "Ref": "DLTVpcDLTFargateIG0E71BA5C", }, "RouteTableId": Object { "Ref": "DLTVpcDLTFargateRT86406464", }, }, "Type": "AWS::EC2::Route", }, "DLTVpcDLTRouteTableAssociationAE94A08EA": Object { "Condition": "CreateFargateVPCResources", "Properties": Object { "RouteTableId": Object { "Ref": "DLTVpcDLTFargateRT86406464", }, "SubnetId": Object { "Ref": "DLTVpcDLTSubnetAAE7DDEE8", }, }, "Type": "AWS::EC2::SubnetRouteTableAssociation", }, "DLTVpcDLTRouteTableAssociationBBED3E4B3": Object { "Condition": "CreateFargateVPCResources", "Properties": Object { "RouteTableId": Object { "Ref": "DLTVpcDLTFargateRT86406464", }, "SubnetId": Object { "Ref": "DLTVpcDLTSubnetB294F4ED2", }, }, "Type": "AWS::EC2::SubnetRouteTableAssociation", }, "DLTVpcDLTSubnetAAE7DDEE8": Object { "Condition": "CreateFargateVPCResources", "Properties": Object { "AvailabilityZone": Object { "Fn::Select": Array [ 0, Object { "Fn::GetAZs": "", }, ], }, "CidrBlock": Object { "Ref": "SubnetACidrBlock", }, "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], "VpcId": Object { "Ref": "DLTVpcDLTFargateVpc0E6FEAB7", }, }, "Type": "AWS::EC2::Subnet", }, "DLTVpcDLTSubnetB294F4ED2": Object { "Condition": "CreateFargateVPCResources", "Properties": Object { "AvailabilityZone": Object { "Fn::Select": Array [ 1, Object { "Fn::GetAZs": "", }, ], }, "CidrBlock": Object { "Ref": "SubnetBCidrBlock", }, "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], "VpcId": Object { "Ref": "DLTVpcDLTFargateVpc0E6FEAB7", }, }, "Type": "AWS::EC2::Subnet", }, "DefaultApplicationAttributesFC1CC26B": Object { "Properties": Object { "Attributes": Object { "applicationType": "AWS-Solutions", "solutionID": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, "solutionName": "Distributed Load Testing", "version": Object { "Fn::FindInMap": Array [ "Solution", "Config", "CodeVersion", ], }, }, "Description": "Attribute group for solution information", "Name": Object { "Ref": "AWS::StackName", }, "Tags": Object { "SolutionId": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, }, "Type": "AWS::ServiceCatalogAppRegistry::AttributeGroup", }, "RealTimeDataRealTimeDataPublisher7E8F8F6C": Object { "DependsOn": Array [ "RealTimeDatarealTimeDataPublisherRoleA8976D01", ], "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W58", "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs.", }, Object { "id": "W89", "reason": "This Lambda function does not require a VPC", }, Object { "id": "W92", "reason": "Does not run concurrent executions", }, ], }, }, "Properties": Object { "Code": Object { "S3Bucket": Object { "Fn::Join": Array [ "-", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "S3Bucket", ], }, Object { "Ref": "AWS::Region", }, ], ], }, "S3Key": Object { "Fn::Join": Array [ "", Array [ Object { "Fn::FindInMap": Array [ "Solution", "Config", "KeyPrefix", ], }, "/real-time-data-publisher.zip", ], ], }, }, "Description": "Real time data publisher", "Environment": Object { "Variables": Object { "IOT_ENDPOINT": Object { "Fn::GetAtt": Array [ "DLTCustomResourcesGetIotEndpoint700ABCC8", "IOT_ENDPOINT", ], }, "MAIN_REGION": Object { "Ref": "AWS::Region", }, "SOLUTION_ID": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, "VERSION": Object { "Fn::FindInMap": Array [ "Solution", "Config", "CodeVersion", ], }, }, }, "Handler": "index.handler", "Role": Object { "Fn::GetAtt": Array [ "RealTimeDatarealTimeDataPublisherRoleA8976D01", "Arn", ], }, "Runtime": "nodejs16.x", "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], "Timeout": 180, }, "Type": "AWS::Lambda::Function", }, "RealTimeDatarealTimeDataPublisherRoleA8976D01": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ Object { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": Object { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, "Policies": Array [ Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": "iot:Publish", "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ "", Array [ "arn:", Object { "Ref": "AWS::Partition", }, ":iot:", Object { "Ref": "AWS::Region", }, ":", Object { "Ref": "AWS::AccountId", }, ":topic/*", ], ], }, }, ], "Version": "2012-10-17", }, "PolicyName": "IoTPolicy", }, ], "Tags": Array [ Object { "Key": "SolutionId", "Value": Object { "Fn::FindInMap": Array [ "Solution", "Config", "SolutionId", ], }, }, ], }, "Type": "AWS::IAM::Role", }, }, "Rules": Object { "ExistingVPCRule": Object { "Assertions": Array [ Object { "Assert": Object { "Fn::Not": Array [ Object { "Fn::Equals": Array [ Object { "Ref": "ExistingSubnetA", }, "", ], }, ], }, "AssertDescription": "If an existing VPC Id is provided, 2 subnet ids need to be provided as well. You neglected to enter the first subnet id", }, Object { "Assert": Object { "Fn::Not": Array [ Object { "Fn::Equals": Array [ Object { "Ref": "ExistingSubnetB", }, "", ], }, ], }, "AssertDescription": "If an existing VPC Id is provided, 2 subnet ids need to be provided as well. You neglected to enter the second subnet id", }, ], "RuleCondition": Object { "Fn::Not": Array [ Object { "Fn::Equals": Array [ Object { "Ref": "ExistingVPCId", }, "", ], }, ], }, }, }, } `;