{
 "Description": "(SO0062-alb-ecs) - Distributed Load Testing on AWS. Fargate-based load testing with JMeter, K6, and Locust. ALB/ECS web console. Version v4.1.0",
 "AWSTemplateFormatVersion": "2010-09-09",
 "Metadata": {
  "AWS::CloudFormation::Interface": {
   "ParameterGroups": [
    {
     "Label": {
      "default": "Console access"
     },
     "Parameters": [
      "AdminName",
      "AdminEmail"
     ]
    },
    {
     "Label": {
      "default": "Network configurations for running distributed load test Fargate tasks"
     },
     "Parameters": [
      "ExistingVPCId",
      "ExistingSubnetA",
      "ExistingSubnetB",
      "VpcCidrBlock",
      "SubnetACidrBlock",
      "SubnetBCidrBlock",
      "EgressCidr"
     ]
    },
    {
     "Label": {
      "default": "Web Console Configuration"
     },
     "Parameters": [
      "ConsoleDomainName",
      "ACMCertificateArn",
      "WebConsoleImageUri",
      "DeployWAF"
     ]
    }
   ],
   "ParameterLabels": {
    "AdminName": {
     "default": "* Administrator Name"
    },
    "AdminEmail": {
     "default": "* Administrator Email"
    },
    "DeployMCPServer": {
     "default": "Deploy MCP Server"
    },
    "ExistingVPCId": {
     "default": "Select an existing VPC in the region"
    },
    "ExistingSubnetA": {
     "default": "Select first subnet from the existing VPC"
    },
    "ExistingSubnetB": {
     "default": "Select second subnet from the existing VPC"
    },
    "VpcCidrBlock": {
     "default": "Provide valid CIDR block for the solution to create VPC"
    },
    "SubnetACidrBlock": {
     "default": "Provide valid CIDR block for subnet A for the solution to create VPC"
    },
    "SubnetBCidrBlock": {
     "default": "Provide valid CIDR block for subnet B for the solution to create VPC"
    },
    "EgressCidr": {
     "default": "Provide CIDR block for allowing outbound traffic of AWS Fargate tasks"
    },
    "UseStableTagging": {
     "default": "Auto-update Container Image"
    },
    "ConsoleDomainName": {
     "default": "* Console Domain Name"
    },
    "ACMCertificateArn": {
     "default": "* ACM Certificate ARN"
    },
    "WebConsoleImageUri": {
     "default": "Web Console Container Image URI"
    },
    "DeployWAF": {
     "default": "Deploy AWS WAF"
    }
   }
  }
 },
 "Parameters": {
  "AdminName": {
   "Type": "String",
   "AllowedPattern": "[a-zA-Z0-9-]+",
   "ConstraintDescription": "Admin username must be a minimum of 4 characters and cannot include spaces",
   "MaxLength": 20,
   "MinLength": 4
  },
  "AdminEmail": {
   "Type": "String",
   "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",
   "MinLength": 5
  },
  "ExistingVPCId": {
   "Type": "String",
   "Default": "",
   "AllowedPattern": "(?:^$|^vpc-[a-zA-Z0-9-]+)",
   "Description": "Existing VPC ID"
  },
  "ExistingSubnetA": {
   "Type": "String",
   "Default": "",
   "AllowedPattern": "(?:^$|^subnet-[a-zA-Z0-9-]+)",
   "Description": "First existing subnet"
  },
  "ExistingSubnetB": {
   "Type": "String",
   "Default": "",
   "AllowedPattern": "(?:^$|^subnet-[a-zA-Z0-9-]+)",
   "Description": "Second existing subnet"
  },
  "VpcCidrBlock": {
   "Type": "String",
   "Default": "192.168.0.0/16",
   "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.",
   "Description": "You may leave this parameter blank if you are using existing VPC"
  },
  "SubnetACidrBlock": {
   "Type": "String",
   "Default": "192.168.0.0/20",
   "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.",
   "Description": "CIDR block for subnet A of the AWS Fargate VPC"
  },
  "SubnetBCidrBlock": {
   "Type": "String",
   "Default": "192.168.16.0/20",
   "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.",
   "Description": "CIDR block for subnet B of the AWS Fargate VPC"
  },
  "EgressCidr": {
   "Type": "String",
   "Default": "0.0.0.0/0",
   "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.",
   "Description": "CIDR Block to restrict the Amazon ECS container outbound access",
   "MaxLength": 18,
   "MinLength": 9
  },
  "UseStableTagging": {
   "Type": "String",
   "Default": "No",
   "AllowedValues": [
    "Yes",
    "No"
   ],
   "Description": "Automatically use the most up to date and secure image up until the next minor release. Selecting 'No' will pull the image as originally released, without any security updates."
  },
  "DeployMCPServer": {
   "Type": "String",
   "Default": "No",
   "AllowedValues": [
    "Yes",
    "No"
   ],
   "Description": "Deploy a remote MCP server to connect AI applications to DLT. See the Implementation Guide for more details."
  },
  "ConsoleDomainName": {
   "Type": "String",
   "AllowedPattern": "^[a-zA-Z0-9][a-zA-Z0-9\\-\\.]*[a-zA-Z0-9]$",
   "ConstraintDescription": "Must be a valid domain name",
   "Description": "Custom domain name for the web console (e.g., dlt.example.com). Must match the ACM certificate."
  },
  "ACMCertificateArn": {
   "Type": "String",
   "AllowedPattern": "arn:aws[a-z-]*:acm:[a-z0-9-]+:[0-9]+:certificate/[a-f0-9-]+",
   "ConstraintDescription": "Must be a valid ACM certificate ARN",
   "Description": "ARN of the ACM certificate for HTTPS. Must be in the same region as the stack."
  },
  "WebConsoleImageUri": {
   "Type": "String",
   "Default": "",
   "AllowedPattern": "^$|^\\d{12}\\.dkr\\.ecr\\.[a-z]{2}(-gov)?-(central|north|south|east|west|northeast|southeast|northwest|southwest)-\\d\\.amazonaws\\.com\\/[a-z0-9._\\/-]+(:[a-zA-Z0-9._-]+|@sha256:[a-fA-F0-9]{64})?$",
   "ConstraintDescription": "Must be empty or a valid ECR image URI (e.g., 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-repo:tag or .../my-repo@sha256:<64-hex-chars>).",
   "Description": "URI of web console container image. If empty, the default public image is used."
  },
  "DeployWAF": {
   "Type": "String",
   "Default": "Yes",
   "AllowedValues": [
    "Yes",
    "No"
   ],
   "Description": "Deploy AWS WAF WebACL on the Application Load Balancer with AWS managed rule groups for common threats, known bad inputs, and IP reputation. Select No to skip WAF deployment."
  }
 },
 "Rules": {
  "ExistingVPCRule": {
   "RuleCondition": {
    "Fn::Not": [
     {
      "Fn::Equals": [
       {
        "Ref": "ExistingVPCId"
       },
       ""
      ]
     }
    ]
   },
   "Assertions": [
    {
     "Assert": {
      "Fn::Not": [
       {
        "Fn::Equals": [
         {
          "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"
    },
    {
     "Assert": {
      "Fn::Not": [
       {
        "Fn::Equals": [
         {
          "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"
    }
   ]
  }
 },
 "Mappings": {
  "Solution": {
   "Config": {
    "CodeVersion": "v4.1.0",
    "SolutionId": "SO0062"
   }
  }
 },
 "Conditions": {
  "CreateFargateVPCResources": {
   "Fn::Equals": [
    {
     "Ref": "ExistingVPCId"
    },
    ""
   ]
  },
  "BoolExistingVPC": {
   "Fn::Not": [
    {
     "Fn::Equals": [
      {
       "Ref": "ExistingVPCId"
      },
      ""
     ]
    }
   ]
  },
  "UseStableTagCondition": {
   "Fn::Equals": [
    {
     "Ref": "UseStableTagging"
    },
    "Yes"
   ]
  },
  "DeployMCPServerCondition": {
   "Fn::Equals": [
    {
     "Ref": "DeployMCPServer"
    },
    "Yes"
   ]
  },
  "DLTConsoleResourcesUsePullThroughCache44DCF31E": {
   "Fn::Equals": [
    {
     "Ref": "WebConsoleImageUri"
    },
    ""
   ]
  },
  "DLTConsoleResourcesDeployWAFCondition29A9E689": {
   "Fn::Equals": [
    {
     "Ref": "DeployWAF"
    },
    "Yes"
   ]
  },
  "DLTApiIsGovCloudPartition6BAD7D2E": {
   "Fn::Equals": [
    {
     "Ref": "AWS::Partition"
    },
    "aws-us-gov"
   ]
  },
  "DLTCognitoAuthIsGovCloudPartition9F5A131A": {
   "Fn::Equals": [
    {
     "Ref": "AWS::Partition"
    },
    "aws-us-gov"
   ]
  },
  "DLTCognitoAuthIsGovCloudEastRegion022D5DDD": {
   "Fn::Equals": [
    {
     "Ref": "AWS::Region"
    },
    "us-gov-east-1"
   ]
  },
  "CDKMetadataAvailable": {
   "Fn::Or": [
    {
     "Fn::Or": [
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "af-south-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-east-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-northeast-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-northeast-2"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-northeast-3"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-south-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-south-2"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-southeast-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-southeast-2"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-southeast-3"
       ]
      }
     ]
    },
    {
     "Fn::Or": [
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-southeast-4"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ca-central-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ca-west-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "cn-north-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "cn-northwest-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-central-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-central-2"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-north-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-south-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-south-2"
       ]
      }
     ]
    },
    {
     "Fn::Or": [
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-west-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-west-2"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-west-3"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "il-central-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "me-central-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "me-south-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "sa-east-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "us-east-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "us-east-2"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "us-west-1"
       ]
      }
     ]
    },
    {
     "Fn::Equals": [
      {
       "Ref": "AWS::Region"
      },
      "us-west-2"
     ]
    }
   ]
  }
 },
 "Resources": {
  "DLTVpcDLTFargateVpc0E6FEAB7": {
   "Type": "AWS::EC2::VPC",
   "Properties": {
    "CidrBlock": {
     "Ref": "VpcCidrBlock"
    },
    "EnableDnsHostnames": true,
    "EnableDnsSupport": true,
    "Tags": [
     {
      "Key": "Name",
      "Value": {
       "Ref": "AWS::StackName"
      }
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W60",
       "reason": "This VPC is used for the test runner Fargate tasks only, it does not require VPC flow logs."
      }
     ]
    }
   },
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTSubnetAAE7DDEE8": {
   "Type": "AWS::EC2::Subnet",
   "Properties": {
    "AvailabilityZone": {
     "Fn::Select": [
      0,
      {
       "Fn::GetAZs": ""
      }
     ]
    },
    "CidrBlock": {
     "Ref": "SubnetACidrBlock"
    },
    "VpcId": {
     "Ref": "DLTVpcDLTFargateVpc0E6FEAB7"
    }
   },
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTSubnetB294F4ED2": {
   "Type": "AWS::EC2::Subnet",
   "Properties": {
    "AvailabilityZone": {
     "Fn::Select": [
      1,
      {
       "Fn::GetAZs": ""
      }
     ]
    },
    "CidrBlock": {
     "Ref": "SubnetBCidrBlock"
    },
    "VpcId": {
     "Ref": "DLTVpcDLTFargateVpc0E6FEAB7"
    }
   },
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTFargateIG0E71BA5C": {
   "Type": "AWS::EC2::InternetGateway",
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTFargateRT86406464": {
   "Type": "AWS::EC2::RouteTable",
   "Properties": {
    "VpcId": {
     "Ref": "DLTVpcDLTFargateVpc0E6FEAB7"
    }
   },
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTGatewayattachment220D400F": {
   "Type": "AWS::EC2::VPCGatewayAttachment",
   "Properties": {
    "InternetGatewayId": {
     "Ref": "DLTVpcDLTFargateIG0E71BA5C"
    },
    "VpcId": {
     "Ref": "DLTVpcDLTFargateVpc0E6FEAB7"
    }
   },
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTRouteF8F2A836": {
   "Type": "AWS::EC2::Route",
   "Properties": {
    "DestinationCidrBlock": "0.0.0.0/0",
    "GatewayId": {
     "Ref": "DLTVpcDLTFargateIG0E71BA5C"
    },
    "RouteTableId": {
     "Ref": "DLTVpcDLTFargateRT86406464"
    }
   },
   "DependsOn": [
    "DLTVpcDLTGatewayattachment220D400F"
   ],
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTRouteTableAssociationAE94A08EA": {
   "Type": "AWS::EC2::SubnetRouteTableAssociation",
   "Properties": {
    "RouteTableId": {
     "Ref": "DLTVpcDLTFargateRT86406464"
    },
    "SubnetId": {
     "Ref": "DLTVpcDLTSubnetAAE7DDEE8"
    }
   },
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTRouteTableAssociationBBED3E4B3": {
   "Type": "AWS::EC2::SubnetRouteTableAssociation",
   "Properties": {
    "RouteTableId": {
     "Ref": "DLTVpcDLTFargateRT86406464"
    },
    "SubnetId": {
     "Ref": "DLTVpcDLTSubnetB294F4ED2"
    }
   },
   "Condition": "CreateFargateVPCResources"
  },
  "DLTCommonResourcesCloudWatchLogsPolicyB29337B0": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":logs:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":log-group:/aws/lambda/*"
         ]
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTCommonResourcesCloudWatchLogsPolicyB29337B0",
    "Roles": [
     {
      "Ref": "DLTCommonResourcesCustomResourceCustomResourceLambdaRole248397C4"
     },
     {
      "Ref": "RealTimeDatarealTimeDataPublisherRoleA8976D01"
     },
     {
      "Ref": "DLTLambdaFunctionLambdaResultsRole2CF2D707"
     },
     {
      "Ref": "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD"
     },
     {
      "Ref": "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF"
     },
     {
      "Ref": "DLTLambdaFunctionTaskStatusRole9288E645"
     },
     {
      "Ref": "DLTLambdaFunctionTestCleanupRoleDC0BEA52"
     },
     {
      "Ref": "DLTLambdaFunctionStabilizationCheckerRole6CBA6344"
     },
     {
      "Ref": "DLTLambdaFunctionStartCommandRole3F343C56"
     },
     {
      "Ref": "DLTLambdaFunctionRegionalSyncRole8A668DCC"
     },
     {
      "Ref": "DLTLambdaFunctionTaskFailureHandlerRoleB2F5047C"
     },
     {
      "Ref": "DLTLambdaFunctionOrphanCleanupRoleB4AD3115"
     },
     {
      "Ref": "DLTLambdaFunctionSFNFailureHandlerRole383D70B7"
     },
     {
      "Ref": "DLTLambdaFunctionTestStatusUpdaterRole997B3321"
     },
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   }
  },
  "DLTCommonResourcesLogsBucket48A2774D": {
   "Type": "AWS::S3::Bucket",
   "Properties": {
    "AccessControl": "LogDeliveryWrite",
    "BucketEncryption": {
     "ServerSideEncryptionConfiguration": [
      {
       "ServerSideEncryptionByDefault": {
        "SSEAlgorithm": "AES256"
       }
      }
     ]
    },
    "OwnershipControls": {
     "Rules": [
      {
       "ObjectOwnership": "ObjectWriter"
      }
     ]
    },
    "PublicAccessBlockConfiguration": {
     "BlockPublicAcls": true,
     "BlockPublicPolicy": true,
     "IgnorePublicAcls": true,
     "RestrictPublicBuckets": true
    },
    "VersioningConfiguration": {
     "Status": "Enabled"
    }
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W35",
       "reason": "This is the logging bucket, it does not require logging."
      },
      {
       "id": "W51",
       "reason": "Since the bucket does not allow the public access, it does not require to have bucket policy."
      }
     ]
    }
   }
  },
  "DLTCommonResourcesLogsBucketPolicyAA7FFB37": {
   "Type": "AWS::S3::BucketPolicy",
   "Properties": {
    "Bucket": {
     "Ref": "DLTCommonResourcesLogsBucket48A2774D"
    },
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "s3:*",
       "Condition": {
        "Bool": {
         "aws:SecureTransport": "false"
        }
       },
       "Effect": "Deny",
       "Principal": {
        "AWS": "*"
       },
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTCommonResourcesLogsBucket48A2774D",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTCommonResourcesLogsBucket48A2774D",
             "Arn"
            ]
           },
           "/*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "s3:PutObject",
       "Condition": {
        "ArnLike": {
         "aws:SourceArn": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":elasticloadbalancing:*:",
            {
             "Ref": "AWS::AccountId"
            },
            ":loadbalancer/*"
           ]
          ]
         }
        }
       },
       "Effect": "Allow",
       "Principal": {
        "Service": "logdelivery.elasticloadbalancing.amazonaws.com"
       },
       "Resource": {
        "Fn::Join": [
         "",
         [
          {
           "Fn::GetAtt": [
            "DLTCommonResourcesLogsBucket48A2774D",
            "Arn"
           ]
          },
          "/alb-access-logs/AWSLogs/",
          {
           "Ref": "AWS::AccountId"
          },
          "/*"
         ]
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    }
   }
  },
  "DLTCommonResourcesCustomResourceCustomResourceLambdaRole248397C4": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "iot:DescribeEndpoint",
          "iot:DetachPrincipalPolicy"
         ],
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": "iot:ListTargetsForPolicy",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":iot:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":policy/*"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "CustomResourcePolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "iot:DescribeEndpoint and iot:DetachPrincipalPolicy cannot specify the resource."
      }
     ]
    },
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTCommonResourcesCustomResourceCustomResourceLambdaRoleDefaultPolicy315DBE14": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "s3:DeleteObject*",
        "s3:PutObject",
        "s3:PutObjectLegalHold",
        "s3:PutObjectRetention",
        "s3:PutObjectTagging",
        "s3:PutObjectVersionTagging",
        "s3:Abort*"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
             "Arn"
            ]
           },
           "/*"
          ]
         ]
        }
       ]
      },
      {
       "Action": [
        "dynamodb:BatchGetItem",
        "dynamodb:Query",
        "dynamodb:GetItem",
        "dynamodb:Scan",
        "dynamodb:ConditionCheckItem",
        "dynamodb:BatchWriteItem",
        "dynamodb:PutItem",
        "dynamodb:UpdateItem",
        "dynamodb:DeleteItem",
        "dynamodb:DescribeTable"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
          "Arn"
         ]
        }
       ]
      },
      {
       "Action": [
        "dynamodb:GetRecords",
        "dynamodb:GetShardIterator"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
          "Arn"
         ]
        }
       ]
      },
      {
       "Action": "events:ListRules",
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":events:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":rule/*"
         ]
        ]
       }
      },
      {
       "Action": [
        "events:PutTargets",
        "events:ListTargetsByRule"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":events:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":rule/*Create"
          ]
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":events:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":rule/*Scheduled"
          ]
         ]
        }
       ]
      },
      {
       "Action": "scheduler:DeleteSchedule",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":scheduler:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":schedule/default/*Create"
          ]
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":scheduler:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":schedule/default/*Scheduled"
          ]
         ]
        }
       ]
      },
      {
       "Action": [
        "s3:GetObject*",
        "s3:GetBucket*",
        "s3:List*",
        "s3:DeleteObject*",
        "s3:PutObject",
        "s3:PutObjectLegalHold",
        "s3:PutObjectRetention",
        "s3:PutObjectTagging",
        "s3:PutObjectVersionTagging",
        "s3:Abort*"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":s3:::",
           {
            "Fn::Join": [
             "-",
             [
              "solutions",
              {
               "Ref": "AWS::Region"
              }
             ]
            ]
           }
          ]
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":s3:::",
           {
            "Fn::Join": [
             "-",
             [
              "solutions",
              {
               "Ref": "AWS::Region"
              }
             ]
            ]
           },
           "/*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "cloudformation:DescribeStacks",
       "Effect": "Allow",
       "Resource": {
        "Ref": "AWS::StackId"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTCommonResourcesCustomResourceCustomResourceLambdaRoleDefaultPolicy315DBE14",
    "Roles": [
     {
      "Ref": "DLTCommonResourcesCustomResourceCustomResourceLambdaRole248397C4"
     }
    ]
   }
  },
  "DLTCustomResourceInfraCustomResourceLambdaA4053269": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/a3fa52a5a11876f72dd3b47e4835c1cdadce9523168f9b145a5f06b0bf5250f1.zip"
    },
    "Description": "CFN Lambda backed custom resource to deploy assets to s3",
    "Environment": {
     "Variables": {
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "MAIN_REGION": {
       "Ref": "AWS::Region"
      },
      "S3_BUCKET": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "DDB_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTCommonResourcesCustomResourceCustomResourceLambdaRole248397C4",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 120
   },
   "DependsOn": [
    "DLTCommonResourcesCustomResourceCustomResourceLambdaRoleDefaultPolicy315DBE14",
    "DLTCommonResourcesCustomResourceCustomResourceLambdaRole248397C4"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "VPC not needed for lambda"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTConsoleResourcesConsoleBucket8C91CC58": {
   "Type": "AWS::S3::Bucket",
   "Properties": {
    "BucketEncryption": {
     "ServerSideEncryptionConfiguration": [
      {
       "ServerSideEncryptionByDefault": {
        "SSEAlgorithm": "aws:kms"
       }
      }
     ]
    },
    "LoggingConfiguration": {
     "DestinationBucketName": {
      "Ref": "DLTCommonResourcesLogsBucket48A2774D"
     },
     "LogFilePrefix": "console-bucket-access/"
    },
    "PublicAccessBlockConfiguration": {
     "BlockPublicAcls": true,
     "BlockPublicPolicy": true,
     "IgnorePublicAcls": true,
     "RestrictPublicBuckets": true
    },
    "VersioningConfiguration": {
     "Status": "Enabled"
    }
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain"
  },
  "DLTConsoleResourcesConsoleBucketPolicyD5E3933D": {
   "Type": "AWS::S3::BucketPolicy",
   "Properties": {
    "Bucket": {
     "Ref": "DLTConsoleResourcesConsoleBucket8C91CC58"
    },
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "s3:*",
       "Condition": {
        "Bool": {
         "aws:SecureTransport": "false"
        }
       },
       "Effect": "Deny",
       "Principal": {
        "AWS": "*"
       },
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTConsoleResourcesConsoleBucket8C91CC58",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTConsoleResourcesConsoleBucket8C91CC58",
             "Arn"
            ]
           },
           "/*"
          ]
         ]
        }
       ]
      }
     ],
     "Version": "2012-10-17"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpc462284F2": {
   "Type": "AWS::EC2::VPC",
   "Properties": {
    "CidrBlock": "10.0.0.0/16",
    "EnableDnsHostnames": true,
    "EnableDnsSupport": true,
    "InstanceTenancy": "default",
    "Tags": [
     {
      "Key": "Name",
      "Value": "distributed-load-testing-on-aws-alb-ecs/DLTConsoleResources/WebConsoleVpc"
     }
    ]
   }
  },
  "DLTConsoleResourcesWebConsoleVpcPublicSubnet1Subnet268AC507": {
   "Type": "AWS::EC2::Subnet",
   "Properties": {
    "AvailabilityZone": {
     "Fn::Select": [
      0,
      {
       "Fn::GetAZs": ""
      }
     ]
    },
    "CidrBlock": "10.0.0.0/24",
    "MapPublicIpOnLaunch": false,
    "Tags": [
     {
      "Key": "aws-cdk:subnet-name",
      "Value": "Public"
     },
     {
      "Key": "aws-cdk:subnet-type",
      "Value": "Public"
     },
     {
      "Key": "Name",
      "Value": "distributed-load-testing-on-aws-alb-ecs/DLTConsoleResources/WebConsoleVpc/PublicSubnet1"
     }
    ],
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "SUBNET_AUTO_ASSIGN_PUBLIC_IP_DISABLED"
     ]
    },
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W33",
       "reason": "Public subnets required for internet-facing ALB, auto-assign disabled"
      }
     ]
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcPublicSubnet1RouteTable9724F127": {
   "Type": "AWS::EC2::RouteTable",
   "Properties": {
    "Tags": [
     {
      "Key": "Name",
      "Value": "distributed-load-testing-on-aws-alb-ecs/DLTConsoleResources/WebConsoleVpc/PublicSubnet1"
     }
    ],
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcPublicSubnet1RouteTableAssociationAB339C5E": {
   "Type": "AWS::EC2::SubnetRouteTableAssociation",
   "Properties": {
    "RouteTableId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpcPublicSubnet1RouteTable9724F127"
    },
    "SubnetId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpcPublicSubnet1Subnet268AC507"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcPublicSubnet1DefaultRouteB5EB8308": {
   "Type": "AWS::EC2::Route",
   "Properties": {
    "DestinationCidrBlock": "0.0.0.0/0",
    "GatewayId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpcIGW2E94414F"
    },
    "RouteTableId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpcPublicSubnet1RouteTable9724F127"
    }
   },
   "DependsOn": [
    "DLTConsoleResourcesWebConsoleVpcVPCGW18B638B2"
   ]
  },
  "DLTConsoleResourcesWebConsoleVpcPublicSubnet2Subnet215A34E7": {
   "Type": "AWS::EC2::Subnet",
   "Properties": {
    "AvailabilityZone": {
     "Fn::Select": [
      1,
      {
       "Fn::GetAZs": ""
      }
     ]
    },
    "CidrBlock": "10.0.1.0/24",
    "MapPublicIpOnLaunch": false,
    "Tags": [
     {
      "Key": "aws-cdk:subnet-name",
      "Value": "Public"
     },
     {
      "Key": "aws-cdk:subnet-type",
      "Value": "Public"
     },
     {
      "Key": "Name",
      "Value": "distributed-load-testing-on-aws-alb-ecs/DLTConsoleResources/WebConsoleVpc/PublicSubnet2"
     }
    ],
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "SUBNET_AUTO_ASSIGN_PUBLIC_IP_DISABLED"
     ]
    },
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W33",
       "reason": "Public subnets required for internet-facing ALB, auto-assign disabled"
      }
     ]
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcPublicSubnet2RouteTable7CF375AA": {
   "Type": "AWS::EC2::RouteTable",
   "Properties": {
    "Tags": [
     {
      "Key": "Name",
      "Value": "distributed-load-testing-on-aws-alb-ecs/DLTConsoleResources/WebConsoleVpc/PublicSubnet2"
     }
    ],
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcPublicSubnet2RouteTableAssociation38F23B7B": {
   "Type": "AWS::EC2::SubnetRouteTableAssociation",
   "Properties": {
    "RouteTableId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpcPublicSubnet2RouteTable7CF375AA"
    },
    "SubnetId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpcPublicSubnet2Subnet215A34E7"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcPublicSubnet2DefaultRoute446095BD": {
   "Type": "AWS::EC2::Route",
   "Properties": {
    "DestinationCidrBlock": "0.0.0.0/0",
    "GatewayId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpcIGW2E94414F"
    },
    "RouteTableId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpcPublicSubnet2RouteTable7CF375AA"
    }
   },
   "DependsOn": [
    "DLTConsoleResourcesWebConsoleVpcVPCGW18B638B2"
   ]
  },
  "DLTConsoleResourcesWebConsoleVpcPrivateSubnet1SubnetB42D85A9": {
   "Type": "AWS::EC2::Subnet",
   "Properties": {
    "AvailabilityZone": {
     "Fn::Select": [
      0,
      {
       "Fn::GetAZs": ""
      }
     ]
    },
    "CidrBlock": "10.0.2.0/24",
    "MapPublicIpOnLaunch": false,
    "Tags": [
     {
      "Key": "aws-cdk:subnet-name",
      "Value": "Private"
     },
     {
      "Key": "aws-cdk:subnet-type",
      "Value": "Isolated"
     },
     {
      "Key": "Name",
      "Value": "distributed-load-testing-on-aws-alb-ecs/DLTConsoleResources/WebConsoleVpc/PrivateSubnet1"
     }
    ],
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcPrivateSubnet1RouteTableCB03919E": {
   "Type": "AWS::EC2::RouteTable",
   "Properties": {
    "Tags": [
     {
      "Key": "Name",
      "Value": "distributed-load-testing-on-aws-alb-ecs/DLTConsoleResources/WebConsoleVpc/PrivateSubnet1"
     }
    ],
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcPrivateSubnet1RouteTableAssociationD116DB00": {
   "Type": "AWS::EC2::SubnetRouteTableAssociation",
   "Properties": {
    "RouteTableId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpcPrivateSubnet1RouteTableCB03919E"
    },
    "SubnetId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpcPrivateSubnet1SubnetB42D85A9"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcPrivateSubnet2Subnet4E1C4D71": {
   "Type": "AWS::EC2::Subnet",
   "Properties": {
    "AvailabilityZone": {
     "Fn::Select": [
      1,
      {
       "Fn::GetAZs": ""
      }
     ]
    },
    "CidrBlock": "10.0.3.0/24",
    "MapPublicIpOnLaunch": false,
    "Tags": [
     {
      "Key": "aws-cdk:subnet-name",
      "Value": "Private"
     },
     {
      "Key": "aws-cdk:subnet-type",
      "Value": "Isolated"
     },
     {
      "Key": "Name",
      "Value": "distributed-load-testing-on-aws-alb-ecs/DLTConsoleResources/WebConsoleVpc/PrivateSubnet2"
     }
    ],
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcPrivateSubnet2RouteTable01366CEB": {
   "Type": "AWS::EC2::RouteTable",
   "Properties": {
    "Tags": [
     {
      "Key": "Name",
      "Value": "distributed-load-testing-on-aws-alb-ecs/DLTConsoleResources/WebConsoleVpc/PrivateSubnet2"
     }
    ],
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcPrivateSubnet2RouteTableAssociationE711561E": {
   "Type": "AWS::EC2::SubnetRouteTableAssociation",
   "Properties": {
    "RouteTableId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpcPrivateSubnet2RouteTable01366CEB"
    },
    "SubnetId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpcPrivateSubnet2Subnet4E1C4D71"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcIGW2E94414F": {
   "Type": "AWS::EC2::InternetGateway",
   "Properties": {
    "Tags": [
     {
      "Key": "Name",
      "Value": "distributed-load-testing-on-aws-alb-ecs/DLTConsoleResources/WebConsoleVpc"
     }
    ]
   }
  },
  "DLTConsoleResourcesWebConsoleVpcVPCGW18B638B2": {
   "Type": "AWS::EC2::VPCGatewayAttachment",
   "Properties": {
    "InternetGatewayId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpcIGW2E94414F"
    },
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcS3Endpoint89B453FE": {
   "Type": "AWS::EC2::VPCEndpoint",
   "Properties": {
    "RouteTableIds": [
     {
      "Ref": "DLTConsoleResourcesWebConsoleVpcPrivateSubnet1RouteTableCB03919E"
     },
     {
      "Ref": "DLTConsoleResourcesWebConsoleVpcPrivateSubnet2RouteTable01366CEB"
     }
    ],
    "ServiceName": {
     "Fn::Join": [
      "",
      [
       "com.amazonaws.",
       {
        "Ref": "AWS::Region"
       },
       ".s3"
      ]
     ]
    },
    "Tags": [
     {
      "Key": "Name",
      "Value": "distributed-load-testing-on-aws-alb-ecs/DLTConsoleResources/WebConsoleVpc"
     }
    ],
    "VpcEndpointType": "Gateway",
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcEcrApiEndpoint718D1C03": {
   "Type": "AWS::EC2::VPCEndpoint",
   "Properties": {
    "PrivateDnsEnabled": true,
    "SecurityGroupIds": [
     {
      "Fn::GetAtt": [
       "DLTConsoleResourcesVpcEndpointSgB1DE1FF4",
       "GroupId"
      ]
     }
    ],
    "ServiceName": {
     "Fn::Join": [
      "",
      [
       "com.amazonaws.",
       {
        "Ref": "AWS::Region"
       },
       ".ecr.api"
      ]
     ]
    },
    "SubnetIds": [
     {
      "Ref": "DLTConsoleResourcesWebConsoleVpcPrivateSubnet1SubnetB42D85A9"
     },
     {
      "Ref": "DLTConsoleResourcesWebConsoleVpcPrivateSubnet2Subnet4E1C4D71"
     }
    ],
    "Tags": [
     {
      "Key": "Name",
      "Value": "distributed-load-testing-on-aws-alb-ecs/DLTConsoleResources/WebConsoleVpc"
     }
    ],
    "VpcEndpointType": "Interface",
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcEcrDkrEndpoint195E512F": {
   "Type": "AWS::EC2::VPCEndpoint",
   "Properties": {
    "PrivateDnsEnabled": true,
    "SecurityGroupIds": [
     {
      "Fn::GetAtt": [
       "DLTConsoleResourcesVpcEndpointSgB1DE1FF4",
       "GroupId"
      ]
     }
    ],
    "ServiceName": {
     "Fn::Join": [
      "",
      [
       "com.amazonaws.",
       {
        "Ref": "AWS::Region"
       },
       ".ecr.dkr"
      ]
     ]
    },
    "SubnetIds": [
     {
      "Ref": "DLTConsoleResourcesWebConsoleVpcPrivateSubnet1SubnetB42D85A9"
     },
     {
      "Ref": "DLTConsoleResourcesWebConsoleVpcPrivateSubnet2Subnet4E1C4D71"
     }
    ],
    "Tags": [
     {
      "Key": "Name",
      "Value": "distributed-load-testing-on-aws-alb-ecs/DLTConsoleResources/WebConsoleVpc"
     }
    ],
    "VpcEndpointType": "Interface",
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleVpcLogsEndpoint860B545B": {
   "Type": "AWS::EC2::VPCEndpoint",
   "Properties": {
    "PrivateDnsEnabled": true,
    "SecurityGroupIds": [
     {
      "Fn::GetAtt": [
       "DLTConsoleResourcesVpcEndpointSgB1DE1FF4",
       "GroupId"
      ]
     }
    ],
    "ServiceName": {
     "Fn::Join": [
      "",
      [
       "com.amazonaws.",
       {
        "Ref": "AWS::Region"
       },
       ".logs"
      ]
     ]
    },
    "SubnetIds": [
     {
      "Ref": "DLTConsoleResourcesWebConsoleVpcPrivateSubnet1SubnetB42D85A9"
     },
     {
      "Ref": "DLTConsoleResourcesWebConsoleVpcPrivateSubnet2Subnet4E1C4D71"
     }
    ],
    "Tags": [
     {
      "Key": "Name",
      "Value": "distributed-load-testing-on-aws-alb-ecs/DLTConsoleResources/WebConsoleVpc"
     }
    ],
    "VpcEndpointType": "Interface",
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   }
  },
  "DLTConsoleResourcesAlbSg0C63D9C7": {
   "Type": "AWS::EC2::SecurityGroup",
   "Properties": {
    "GroupDescription": "ALB security group - HTTPS from internet",
    "SecurityGroupIngress": [
     {
      "CidrIp": "0.0.0.0/0",
      "Description": "Allow HTTPS from internet",
      "FromPort": 443,
      "IpProtocol": "tcp",
      "ToPort": 443
     },
     {
      "CidrIp": "0.0.0.0/0",
      "Description": "Allow HTTP for redirect to HTTPS",
      "FromPort": 80,
      "IpProtocol": "tcp",
      "ToPort": 80
     }
    ],
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "SECURITY_GROUP_MISSING_EGRESS_RULE",
      "EC2_SECURITY_GROUP_INGRESS_OPEN_TO_WORLD_RULE",
      "SECURITY_GROUP_INGRESS_CIDR_NON_32_RULE"
     ]
    },
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W2",
       "reason": "Internet-facing ALB requires ingress from 0.0.0.0/0 for HTTPS traffic"
      },
      {
       "id": "W5",
       "reason": "Egress restricted to ECS tasks only via explicit rule"
      },
      {
       "id": "W9",
       "reason": "Internet-facing ALB requires ingress from 0.0.0.0/0"
      },
      {
       "id": "F1000",
       "reason": "Egress rule added explicitly to ECS security group"
      }
     ]
    }
   }
  },
  "DLTConsoleResourcesAlbSgtodistributedloadtestingonawsalbecsDLTConsoleResourcesEcsSgE44E4C1E808087671893": {
   "Type": "AWS::EC2::SecurityGroupEgress",
   "Properties": {
    "Description": "Allow HTTP to ECS tasks",
    "DestinationSecurityGroupId": {
     "Fn::GetAtt": [
      "DLTConsoleResourcesEcsSg89E42D3E",
      "GroupId"
     ]
    },
    "FromPort": 8080,
    "GroupId": {
     "Fn::GetAtt": [
      "DLTConsoleResourcesAlbSg0C63D9C7",
      "GroupId"
     ]
    },
    "IpProtocol": "tcp",
    "ToPort": 8080
   }
  },
  "DLTConsoleResourcesEcsSg89E42D3E": {
   "Type": "AWS::EC2::SecurityGroup",
   "Properties": {
    "GroupDescription": "ECS tasks security group",
    "SecurityGroupEgress": [
     {
      "CidrIp": "0.0.0.0/0",
      "Description": "Allow all outbound traffic by default",
      "IpProtocol": "-1"
     }
    ],
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "EC2_SECURITY_GROUP_EGRESS_OPEN_TO_WORLD_RULE",
      "SECURITY_GROUP_EGRESS_ALL_PROTOCOLS_RULE"
     ]
    },
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W5",
       "reason": "ECS tasks require outbound access to S3 Gateway endpoint (prefix list) and VPC interface endpoints. VPC has no NAT/internet gateway."
      },
      {
       "id": "W40",
       "reason": "Egress to S3 Gateway endpoint requires all protocols as it uses prefix lists, not security groups"
      }
     ]
    }
   }
  },
  "DLTConsoleResourcesEcsSgfromdistributedloadtestingonawsalbecsDLTConsoleResourcesAlbSgEF9002168080429BAD5F": {
   "Type": "AWS::EC2::SecurityGroupIngress",
   "Properties": {
    "Description": "Allow HTTP from ALB",
    "FromPort": 8080,
    "GroupId": {
     "Fn::GetAtt": [
      "DLTConsoleResourcesEcsSg89E42D3E",
      "GroupId"
     ]
    },
    "IpProtocol": "tcp",
    "SourceSecurityGroupId": {
     "Fn::GetAtt": [
      "DLTConsoleResourcesAlbSg0C63D9C7",
      "GroupId"
     ]
    },
    "ToPort": 8080
   }
  },
  "DLTConsoleResourcesVpcEndpointSgB1DE1FF4": {
   "Type": "AWS::EC2::SecurityGroup",
   "Properties": {
    "GroupDescription": "VPC endpoints security group",
    "SecurityGroupIngress": [
     {
      "CidrIp": {
       "Fn::GetAtt": [
        "DLTConsoleResourcesWebConsoleVpc462284F2",
        "CidrBlock"
       ]
      },
      "Description": {
       "Fn::Join": [
        "",
        [
         "from ",
         {
          "Fn::GetAtt": [
           "DLTConsoleResourcesWebConsoleVpc462284F2",
           "CidrBlock"
          ]
         },
         ":443"
        ]
       ]
      },
      "FromPort": 443,
      "IpProtocol": "tcp",
      "ToPort": 443
     }
    ],
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "SECURITY_GROUP_EGRESS_PORT_RANGE_RULE",
      "SECURITY_GROUP_MISSING_EGRESS_RULE"
     ]
    },
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W5",
       "reason": "VPC endpoint security group egress restricted to ECS tasks only"
      }
     ]
    }
   }
  },
  "DLTConsoleResourcesVpcEndpointSgfromdistributedloadtestingonawsalbecsDLTConsoleResourcesEcsSgE44E4C1E443A99C5DAF": {
   "Type": "AWS::EC2::SecurityGroupIngress",
   "Properties": {
    "Description": "Allow HTTPS from ECS tasks",
    "FromPort": 443,
    "GroupId": {
     "Fn::GetAtt": [
      "DLTConsoleResourcesVpcEndpointSgB1DE1FF4",
      "GroupId"
     ]
    },
    "IpProtocol": "tcp",
    "SourceSecurityGroupId": {
     "Fn::GetAtt": [
      "DLTConsoleResourcesEcsSg89E42D3E",
      "GroupId"
     ]
    },
    "ToPort": 443
   }
  },
  "DLTConsoleResourcesVpcEndpointSgtodistributedloadtestingonawsalbecsDLTConsoleResourcesEcsSgE44E4C1E443DF68F67E": {
   "Type": "AWS::EC2::SecurityGroupEgress",
   "Properties": {
    "Description": "Allow HTTPS response to ECS tasks",
    "DestinationSecurityGroupId": {
     "Fn::GetAtt": [
      "DLTConsoleResourcesEcsSg89E42D3E",
      "GroupId"
     ]
    },
    "FromPort": 443,
    "GroupId": {
     "Fn::GetAtt": [
      "DLTConsoleResourcesVpcEndpointSgB1DE1FF4",
      "GroupId"
     ]
    },
    "IpProtocol": "tcp",
    "ToPort": 443
   }
  },
  "DLTConsoleResourcesEcrPullThroughCacheB9B079AD": {
   "Type": "AWS::ECR::PullThroughCacheRule",
   "Properties": {
    "EcrRepositoryPrefix": {
     "Fn::Join": [
      "-",
      [
       "dlt",
       {
        "Fn::Select": [
         4,
         {
          "Fn::Split": [
           "-",
           {
            "Fn::Select": [
             2,
             {
              "Fn::Split": [
               "/",
               {
                "Ref": "AWS::StackId"
               }
              ]
             }
            ]
           }
          ]
         }
        ]
       }
      ]
     ]
    },
    "UpstreamRegistryUrl": "public.ecr.aws"
   },
   "Condition": "DLTConsoleResourcesUsePullThroughCache44DCF31E"
  },
  "DLTConsoleResourcesWebConsoleCluster56F28982": {
   "Type": "AWS::ECS::Cluster",
   "Properties": {
    "ClusterSettings": [
     {
      "Name": "containerInsights",
      "Value": "enabled"
     }
    ],
    "Tags": [
     {
      "Key": "SolutionId",
      "Value": {
       "Fn::FindInMap": [
        "Solution",
        "Config",
        "SolutionId"
       ]
      }
     }
    ]
   }
  },
  "DLTConsoleResourcesWebConsoleLogGroupA6C7336E": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "RetentionInDays": 365,
    "Tags": [
     {
      "Key": "SolutionId",
      "Value": {
       "Fn::FindInMap": [
        "Solution",
        "Config",
        "SolutionId"
       ]
      }
     }
    ]
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    },
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W84",
       "reason": "CloudWatch Logs are encrypted by default with AWS managed keys"
      }
     ]
    }
   }
  },
  "DLTConsoleResourcesTaskExecutionRoleB4073E14": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "logs:CreateLogStream",
          "logs:PutLogEvents"
         ],
         "Effect": "Allow",
         "Resource": [
          {
           "Fn::GetAtt": [
            "DLTConsoleResourcesWebConsoleLogGroupA6C7336E",
            "Arn"
           ]
          },
          {
           "Fn::Join": [
            "",
            [
             {
              "Fn::GetAtt": [
               "DLTConsoleResourcesWebConsoleLogGroupA6C7336E",
               "Arn"
              ]
             },
             ":*"
            ]
           ]
          }
         ]
        },
        {
         "Action": "ecr:GetAuthorizationToken",
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": [
          "ecr:BatchCheckLayerAvailability",
          "ecr:GetDownloadUrlForLayer",
          "ecr:BatchGetImage"
         ],
         "Effect": "Allow",
         "Resource": {
          "Fn::If": [
           "DLTConsoleResourcesUsePullThroughCache44DCF31E",
           {
            "Fn::Join": [
             "",
             [
              "arn:",
              {
               "Ref": "AWS::Partition"
              },
              ":ecr:",
              {
               "Ref": "AWS::Region"
              },
              ":",
              {
               "Ref": "AWS::AccountId"
              },
              ":repository/",
              {
               "Fn::Join": [
                "-",
                [
                 "dlt",
                 {
                  "Fn::Select": [
                   4,
                   {
                    "Fn::Split": [
                     "-",
                     {
                      "Fn::Select": [
                       2,
                       {
                        "Fn::Split": [
                         "/",
                         {
                          "Ref": "AWS::StackId"
                         }
                        ]
                       }
                      ]
                     }
                    ]
                   }
                  ]
                 }
                ]
               ]
              },
              "/aws-solutions/distributed-load-testing-on-aws-web-console"
             ]
            ]
           },
           {
            "Fn::Join": [
             "",
             [
              "arn:",
              {
               "Ref": "AWS::Partition"
              },
              ":ecr:",
              {
               "Ref": "AWS::Region"
              },
              ":",
              {
               "Ref": "AWS::AccountId"
              },
              ":repository/",
              {
               "Fn::Select": [
                1,
                {
                 "Fn::Split": [
                  ".amazonaws.com/",
                  {
                   "Fn::Select": [
                    0,
                    {
                     "Fn::Split": [
                      ":",
                      {
                       "Ref": "WebConsoleImageUri"
                      }
                     ]
                    }
                   ]
                  }
                 ]
                }
               ]
              }
             ]
            ]
           }
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "ECSTaskExecutionPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK",
      "IAM_POLICYDOCUMENT_NO_WILDCARD_RESOURCE"
     ]
    },
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "F10",
       "reason": "Inline policy required for ECS task execution role with specific permissions"
      },
      {
       "id": "W11",
       "reason": "ecr:GetAuthorizationToken requires wildcard resource as it is an account-level action"
      }
     ]
    }
   }
  },
  "DLTConsoleResourcesTaskExecutionRoleDefaultPolicy1F93473A": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTConsoleResourcesWebConsoleLogGroupA6C7336E",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTConsoleResourcesTaskExecutionRoleDefaultPolicy1F93473A",
    "Roles": [
     {
      "Ref": "DLTConsoleResourcesTaskExecutionRoleB4073E14"
     }
    ]
   }
  },
  "DLTConsoleResourcesPullThroughCacheWritePolicyA42B2884": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "ecr:CreateRepository",
        "ecr:BatchImportUpstreamImage"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":ecr:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":repository/",
          {
           "Fn::Join": [
            "-",
            [
             "dlt",
             {
              "Fn::Select": [
               4,
               {
                "Fn::Split": [
                 "-",
                 {
                  "Fn::Select": [
                   2,
                   {
                    "Fn::Split": [
                     "/",
                     {
                      "Ref": "AWS::StackId"
                     }
                    ]
                   }
                  ]
                 }
                ]
               }
              ]
             }
            ]
           ]
          },
          "/aws-solutions/distributed-load-testing-on-aws-web-console"
         ]
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTConsoleResourcesPullThroughCacheWritePolicyA42B2884",
    "Roles": [
     {
      "Ref": "DLTConsoleResourcesTaskExecutionRoleB4073E14"
     }
    ]
   },
   "Condition": "DLTConsoleResourcesUsePullThroughCache44DCF31E"
  },
  "DLTConsoleResourcesTaskRole59FF22B3": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "s3:GetObject",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            {
             "Fn::GetAtt": [
              "DLTConsoleResourcesConsoleBucket8C91CC58",
              "Arn"
             ]
            },
            "/dlt-web-console.zip"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "S3AccessPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    },
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "F10",
       "reason": "Inline policy required for ECS task role with specific S3 permissions"
      }
     ]
    }
   }
  },
  "DLTConsoleResourcesWebConsoleTaskDef55DBAC37": {
   "Type": "AWS::ECS::TaskDefinition",
   "Properties": {
    "ContainerDefinitions": [
     {
      "Environment": [
       {
        "Name": "S3_BUCKET",
        "Value": {
         "Ref": "DLTConsoleResourcesConsoleBucket8C91CC58"
        }
       },
       {
        "Name": "S3_KEY",
        "Value": "dlt-web-console.zip"
       },
       {
        "Name": "COGNITO_DOMAIN",
        "Value": {
         "Fn::Join": [
          "",
          [
           "dlt-",
           {
            "Fn::GetAtt": [
             "DLTCustomResourcesCustomResourceUuidD1C03F15",
             "UUID"
            ]
           },
           {
            "Fn::If": [
             "DLTCognitoAuthIsGovCloudPartition9F5A131A",
             ".auth-fips.",
             ".auth."
            ]
           },
           {
            "Ref": "AWS::Region"
           },
           ".amazoncognito.com"
          ]
         ]
        }
       }
      ],
      "Essential": true,
      "Image": {
       "Fn::If": [
        "DLTConsoleResourcesUsePullThroughCache44DCF31E",
        {
         "Fn::Join": [
          "",
          [
           {
            "Ref": "AWS::AccountId"
           },
           ".dkr.ecr.",
           {
            "Ref": "AWS::Region"
           },
           ".amazonaws.com/",
           {
            "Fn::Join": [
             "-",
             [
              "dlt",
              {
               "Fn::Select": [
                4,
                {
                 "Fn::Split": [
                  "-",
                  {
                   "Fn::Select": [
                    2,
                    {
                     "Fn::Split": [
                      "/",
                      {
                       "Ref": "AWS::StackId"
                      }
                     ]
                    }
                   ]
                  }
                 ]
                }
               ]
              }
             ]
            ]
           },
           "/aws-solutions/distributed-load-testing-on-aws-web-console:v4.1.0"
          ]
         ]
        },
        {
         "Ref": "WebConsoleImageUri"
        }
       ]
      },
      "LogConfiguration": {
       "LogDriver": "awslogs",
       "Options": {
        "awslogs-group": {
         "Ref": "DLTConsoleResourcesWebConsoleLogGroupA6C7336E"
        },
        "awslogs-stream-prefix": "web-console",
        "awslogs-region": {
         "Ref": "AWS::Region"
        }
       }
      },
      "Name": "web-console",
      "PortMappings": [
       {
        "ContainerPort": 8080,
        "Protocol": "tcp"
       }
      ]
     }
    ],
    "Cpu": "256",
    "ExecutionRoleArn": {
     "Fn::GetAtt": [
      "DLTConsoleResourcesTaskExecutionRoleB4073E14",
      "Arn"
     ]
    },
    "Family": "distributedloadtestingonawsalbecsDLTConsoleResourcesWebConsoleTaskDefE08DCC9F",
    "Memory": "512",
    "NetworkMode": "awsvpc",
    "RequiresCompatibilities": [
     "FARGATE"
    ],
    "Tags": [
     {
      "Key": "SolutionId",
      "Value": {
       "Fn::FindInMap": [
        "Solution",
        "Config",
        "SolutionId"
       ]
      }
     }
    ],
    "TaskRoleArn": {
     "Fn::GetAtt": [
      "DLTConsoleResourcesTaskRole59FF22B3",
      "Arn"
     ]
    }
   }
  },
  "DLTConsoleResourcesWebConsoleAlb08993363": {
   "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
   "Properties": {
    "LoadBalancerAttributes": [
     {
      "Key": "deletion_protection.enabled",
      "Value": "false"
     },
     {
      "Key": "access_logs.s3.enabled",
      "Value": "true"
     },
     {
      "Key": "access_logs.s3.bucket",
      "Value": {
       "Ref": "DLTCommonResourcesLogsBucket48A2774D"
      }
     },
     {
      "Key": "access_logs.s3.prefix",
      "Value": "alb-access-logs"
     }
    ],
    "Scheme": "internet-facing",
    "SecurityGroups": [
     {
      "Fn::GetAtt": [
       "DLTConsoleResourcesAlbSg0C63D9C7",
       "GroupId"
      ]
     }
    ],
    "Subnets": [
     {
      "Ref": "DLTConsoleResourcesWebConsoleVpcPublicSubnet1Subnet268AC507"
     },
     {
      "Ref": "DLTConsoleResourcesWebConsoleVpcPublicSubnet2Subnet215A34E7"
     }
    ],
    "Type": "application"
   },
   "DependsOn": [
    "DLTCommonResourcesLogsBucketPolicyAA7FFB37",
    "DLTConsoleResourcesWebConsoleVpcPublicSubnet1DefaultRouteB5EB8308",
    "DLTConsoleResourcesWebConsoleVpcPublicSubnet1RouteTableAssociationAB339C5E",
    "DLTConsoleResourcesWebConsoleVpcPublicSubnet2DefaultRoute446095BD",
    "DLTConsoleResourcesWebConsoleVpcPublicSubnet2RouteTableAssociation38F23B7B"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W52",
       "reason": "ALB access logging is enabled to the S3 logs bucket."
      }
     ]
    }
   }
  },
  "DLTConsoleResourcesWebConsoleAlbHttpsListener3D73AE0D": {
   "Type": "AWS::ElasticLoadBalancingV2::Listener",
   "Properties": {
    "Certificates": [
     {
      "CertificateArn": {
       "Ref": "ACMCertificateArn"
      }
     }
    ],
    "DefaultActions": [
     {
      "TargetGroupArn": {
       "Ref": "DLTConsoleResourcesWebConsoleTg634B4E36"
      },
      "Type": "forward"
     }
    ],
    "LoadBalancerArn": {
     "Ref": "DLTConsoleResourcesWebConsoleAlb08993363"
    },
    "Port": 443,
    "Protocol": "HTTPS",
    "SslPolicy": "ELBSecurityPolicy-TLS-1-2-2017-01"
   },
   "DependsOn": [
    "DLTCommonResourcesLogsBucketPolicyAA7FFB37"
   ],
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "ELBV2_LISTENER_SSL_POLICY_RULE"
     ]
    }
   }
  },
  "DLTConsoleResourcesWebConsoleAlbHttpRedirectListenerBDFDA796": {
   "Type": "AWS::ElasticLoadBalancingV2::Listener",
   "Properties": {
    "DefaultActions": [
     {
      "RedirectConfig": {
       "Port": "443",
       "Protocol": "HTTPS",
       "StatusCode": "HTTP_301"
      },
      "Type": "redirect"
     }
    ],
    "LoadBalancerArn": {
     "Ref": "DLTConsoleResourcesWebConsoleAlb08993363"
    },
    "Port": 80,
    "Protocol": "HTTP"
   },
   "DependsOn": [
    "DLTCommonResourcesLogsBucketPolicyAA7FFB37"
   ],
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "ELBV2_LISTENER_SSL_POLICY_RULE",
      "ELBV2_LISTENER_PROTOCOL_RULE"
     ]
    },
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W55",
       "reason": "HTTP listener is used solely for redirecting to HTTPS"
      },
      {
       "id": "W56",
       "reason": "HTTP listener is used solely for redirecting to HTTPS, not serving content"
      }
     ]
    }
   }
  },
  "DLTConsoleResourcesAlbWebAcl19761AEC": {
   "Type": "AWS::WAFv2::WebACL",
   "Properties": {
    "DefaultAction": {
     "Allow": {}
    },
    "Rules": [
     {
      "Name": "AWSManagedRulesCommonRuleSet",
      "OverrideAction": {
       "None": {}
      },
      "Priority": 1,
      "Statement": {
       "ManagedRuleGroupStatement": {
        "Name": "AWSManagedRulesCommonRuleSet",
        "VendorName": "AWS"
       }
      },
      "VisibilityConfig": {
       "CloudWatchMetricsEnabled": true,
       "MetricName": "AWSManagedRulesCommonRuleSet",
       "SampledRequestsEnabled": true
      }
     },
     {
      "Name": "AWSManagedRulesAmazonIpReputationList",
      "OverrideAction": {
       "None": {}
      },
      "Priority": 2,
      "Statement": {
       "ManagedRuleGroupStatement": {
        "Name": "AWSManagedRulesAmazonIpReputationList",
        "VendorName": "AWS"
       }
      },
      "VisibilityConfig": {
       "CloudWatchMetricsEnabled": true,
       "MetricName": "AWSManagedRulesAmazonIpReputationList",
       "SampledRequestsEnabled": true
      }
     },
     {
      "Name": "AWSManagedRulesAnonymousIpList",
      "OverrideAction": {
       "None": {}
      },
      "Priority": 3,
      "Statement": {
       "ManagedRuleGroupStatement": {
        "Name": "AWSManagedRulesAnonymousIpList",
        "VendorName": "AWS"
       }
      },
      "VisibilityConfig": {
       "CloudWatchMetricsEnabled": true,
       "MetricName": "AWSManagedRulesAnonymousIpList",
       "SampledRequestsEnabled": true
      }
     }
    ],
    "Scope": "REGIONAL",
    "Tags": [
     {
      "Key": "SolutionId",
      "Value": {
       "Fn::FindInMap": [
        "Solution",
        "Config",
        "SolutionId"
       ]
      }
     }
    ],
    "VisibilityConfig": {
     "CloudWatchMetricsEnabled": true,
     "MetricName": "DLTConsoleAlbWebAcl",
     "SampledRequestsEnabled": true
    }
   },
   "Condition": "DLTConsoleResourcesDeployWAFCondition29A9E689"
  },
  "DLTConsoleResourcesAlbWebAclAssociation52B1C96A": {
   "Type": "AWS::WAFv2::WebACLAssociation",
   "Properties": {
    "ResourceArn": {
     "Ref": "DLTConsoleResourcesWebConsoleAlb08993363"
    },
    "WebACLArn": {
     "Fn::GetAtt": [
      "DLTConsoleResourcesAlbWebAcl19761AEC",
      "Arn"
     ]
    }
   },
   "Condition": "DLTConsoleResourcesDeployWAFCondition29A9E689"
  },
  "DLTConsoleResourcesWafLogGroup135B1530": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "aws-waf-logs-",
       {
        "Ref": "AWS::StackName"
       }
      ]
     ]
    },
    "RetentionInDays": 365
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    },
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W84",
       "reason": "CloudWatch Logs are encrypted by default with AWS managed keys"
      }
     ]
    }
   },
   "Condition": "DLTConsoleResourcesDeployWAFCondition29A9E689"
  },
  "DLTConsoleResourcesWafLoggingConfig36F81FD7": {
   "Type": "AWS::WAFv2::LoggingConfiguration",
   "Properties": {
    "LogDestinationConfigs": [
     {
      "Fn::GetAtt": [
       "DLTConsoleResourcesWafLogGroup135B1530",
       "Arn"
      ]
     }
    ],
    "ResourceArn": {
     "Fn::GetAtt": [
      "DLTConsoleResourcesAlbWebAcl19761AEC",
      "Arn"
     ]
    }
   },
   "Condition": "DLTConsoleResourcesDeployWAFCondition29A9E689"
  },
  "DLTConsoleResourcesWebConsoleTg634B4E36": {
   "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
   "Properties": {
    "HealthCheckIntervalSeconds": 30,
    "HealthCheckPath": "/healthz",
    "HealthyThresholdCount": 2,
    "Port": 8080,
    "Protocol": "HTTP",
    "TargetGroupAttributes": [
     {
      "Key": "stickiness.enabled",
      "Value": "false"
     }
    ],
    "TargetType": "ip",
    "UnhealthyThresholdCount": 3,
    "VpcId": {
     "Ref": "DLTConsoleResourcesWebConsoleVpc462284F2"
    }
   }
  },
  "DLTConsoleResourcesWebConsoleService070C3EAA": {
   "Type": "AWS::ECS::Service",
   "Properties": {
    "Cluster": {
     "Ref": "DLTConsoleResourcesWebConsoleCluster56F28982"
    },
    "DeploymentConfiguration": {
     "Alarms": {
      "AlarmNames": [],
      "Enable": false,
      "Rollback": false
     },
     "DeploymentCircuitBreaker": {
      "Enable": true,
      "Rollback": true
     },
     "MaximumPercent": 200,
     "MinimumHealthyPercent": 50
    },
    "DeploymentController": {
     "Type": "ECS"
    },
    "DesiredCount": 2,
    "EnableECSManagedTags": false,
    "HealthCheckGracePeriodSeconds": 120,
    "LaunchType": "FARGATE",
    "LoadBalancers": [
     {
      "ContainerName": "web-console",
      "ContainerPort": 8080,
      "TargetGroupArn": {
       "Ref": "DLTConsoleResourcesWebConsoleTg634B4E36"
      }
     }
    ],
    "NetworkConfiguration": {
     "AwsvpcConfiguration": {
      "AssignPublicIp": "DISABLED",
      "SecurityGroups": [
       {
        "Fn::GetAtt": [
         "DLTConsoleResourcesEcsSg89E42D3E",
         "GroupId"
        ]
       }
      ],
      "Subnets": [
       {
        "Ref": "DLTConsoleResourcesWebConsoleVpcPrivateSubnet1SubnetB42D85A9"
       },
       {
        "Ref": "DLTConsoleResourcesWebConsoleVpcPrivateSubnet2Subnet4E1C4D71"
       }
      ]
     }
    },
    "TaskDefinition": {
     "Ref": "DLTConsoleResourcesWebConsoleTaskDef55DBAC37"
    }
   },
   "DependsOn": [
    "DLTConsoleResourcesTaskRole59FF22B3",
    "DLTConsoleResourcesWebConsoleAlbHttpsListener3D73AE0D"
   ]
  },
  "DLTTestRunnerStorageDLTScenariosBucketA9290D21": {
   "Type": "AWS::S3::Bucket",
   "Properties": {
    "BucketEncryption": {
     "ServerSideEncryptionConfiguration": [
      {
       "ServerSideEncryptionByDefault": {
        "SSEAlgorithm": "aws:kms"
       }
      }
     ]
    },
    "CorsConfiguration": {
     "CorsRules": [
      {
       "AllowedHeaders": [
        "*"
       ],
       "AllowedMethods": [
        "GET",
        "POST",
        "PUT",
        "HEAD"
       ],
       "AllowedOrigins": [
        {
         "Fn::Join": [
          "",
          [
           "https://",
           {
            "Ref": "ConsoleDomainName"
           }
          ]
         ]
        }
       ],
       "ExposedHeaders": [
        "ETag"
       ]
      }
     ]
    },
    "LoggingConfiguration": {
     "DestinationBucketName": {
      "Ref": "DLTCommonResourcesLogsBucket48A2774D"
     },
     "LogFilePrefix": "scenarios-bucket-access/"
    },
    "PublicAccessBlockConfiguration": {
     "BlockPublicAcls": true,
     "BlockPublicPolicy": true,
     "IgnorePublicAcls": true,
     "RestrictPublicBuckets": true
    },
    "VersioningConfiguration": {
     "Status": "Enabled"
    }
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain"
  },
  "DLTTestRunnerStorageDLTScenariosBucketPolicy96221788": {
   "Type": "AWS::S3::BucketPolicy",
   "Properties": {
    "Bucket": {
     "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
    },
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "s3:*",
       "Condition": {
        "Bool": {
         "aws:SecureTransport": "false"
        }
       },
       "Effect": "Deny",
       "Principal": {
        "AWS": "*"
       },
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
             "Arn"
            ]
           },
           "/*"
          ]
         ]
        }
       ]
      }
     ],
     "Version": "2012-10-17"
    }
   }
  },
  "DLTTestRunnerStorageScenariosS3PolicyD20D3673": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "s3:HeadObject",
        "s3:PutObject",
        "s3:GetObject",
        "s3:ListBucket"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
             "Arn"
            ]
           },
           "/*"
          ]
         ]
        }
       ]
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTTestRunnerStorageScenariosS3PolicyD20D3673",
    "Roles": [
     {
      "Ref": "DLTLambdaFunctionLambdaResultsRole2CF2D707"
     },
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   }
  },
  "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A": {
   "Type": "AWS::DynamoDB::Table",
   "Properties": {
    "AttributeDefinitions": [
     {
      "AttributeName": "testId",
      "AttributeType": "S"
     }
    ],
    "BillingMode": "PAY_PER_REQUEST",
    "KeySchema": [
     {
      "AttributeName": "testId",
      "KeyType": "HASH"
     }
    ],
    "PointInTimeRecoverySpecification": {
     "PointInTimeRecoveryEnabled": true
    },
    "SSESpecification": {
     "SSEEnabled": true
    }
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "DYNAMODB_TABLE_ENCRYPTED_KMS"
     ]
    }
   }
  },
  "DLTTestRunnerStorageDLTHistoryTable46D850CC": {
   "Type": "AWS::DynamoDB::Table",
   "Properties": {
    "AttributeDefinitions": [
     {
      "AttributeName": "testId",
      "AttributeType": "S"
     },
     {
      "AttributeName": "testRunId",
      "AttributeType": "S"
     },
     {
      "AttributeName": "startTime",
      "AttributeType": "S"
     }
    ],
    "BillingMode": "PAY_PER_REQUEST",
    "GlobalSecondaryIndexes": [
     {
      "IndexName": "testId-startTime-index",
      "KeySchema": [
       {
        "AttributeName": "testId",
        "KeyType": "HASH"
       },
       {
        "AttributeName": "startTime",
        "KeyType": "RANGE"
       }
      ],
      "Projection": {
       "NonKeyAttributes": [
        "testRunId",
        "endTime",
        "status",
        "results"
       ],
       "ProjectionType": "INCLUDE"
      }
     }
    ],
    "KeySchema": [
     {
      "AttributeName": "testId",
      "KeyType": "HASH"
     },
     {
      "AttributeName": "testRunId",
      "KeyType": "RANGE"
     }
    ],
    "PointInTimeRecoverySpecification": {
     "PointInTimeRecoveryEnabled": true
    },
    "SSESpecification": {
     "SSEEnabled": true
    }
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "DYNAMODB_TABLE_ENCRYPTED_KMS"
     ]
    }
   }
  },
  "DLTTestRunnerStorageHistoryDynamoDbPolicyA439CB46": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "dynamodb:BatchWriteItem",
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:UpdateItem",
        "dynamodb:Query"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTTestRunnerStorageDLTHistoryTable46D850CC",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTTestRunnerStorageDLTHistoryTable46D850CC",
             "Arn"
            ]
           },
           "/index/*"
          ]
         ]
        }
       ]
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTTestRunnerStorageHistoryDynamoDbPolicyA439CB46",
    "Roles": [
     {
      "Ref": "DLTLambdaFunctionLambdaResultsRole2CF2D707"
     },
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   }
  },
  "DLTTestRunnerStorageScenarioDynamoDbPolicy8B391249": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "dynamodb:DeleteItem",
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:Scan",
        "dynamodb:UpdateItem"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTTestRunnerStorageScenarioDynamoDbPolicy8B391249",
    "Roles": [
     {
      "Ref": "DLTLambdaFunctionLambdaResultsRole2CF2D707"
     },
     {
      "Ref": "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD"
     },
     {
      "Ref": "DLTLambdaFunctionTaskStatusRole9288E645"
     },
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   }
  },
  "DLTCustomResourcesGetIotEndpoint700ABCC8": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "Resource": "GetIotEndpoint"
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCustomResourcesCustomResourceUuidD1C03F15": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "Resource": "UUID"
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCustomResourcesBackwardsCompatibilityUpdateV3toV4CA07A806": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "Resource": "V3toV4BackCompat"
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCustomResourcesDetachIotPrincipalPolicyE4A7C1B8": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "Resource": "DetachIotPolicy",
    "IotPolicyName": {
     "Ref": "DLTCognitoAuthIoTPolicyB8FDFE53"
    }
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCustomResourcesCleanUpTestScenariosB69DD18C": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "Resource": "CleanUpTestScenarios"
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCustomResourcesPutRegionalTemplate5479575B": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "Resource": "PutRegionalTemplate",
    "SrcBucket": {
     "Fn::Join": [
      "-",
      [
       "solutions",
       {
        "Ref": "AWS::Region"
       }
      ]
     ]
    },
    "SrcPath": "distributed-load-testing-on-aws/v4.1.0",
    "DestBucket": {
     "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
    },
    "MainRegionLambdaTaskRoleArn": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD",
      "Arn"
     ]
    },
    "ScenariosTable": {
     "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
    },
    "MainRegionStack": {
     "Ref": "AWS::Region"
    },
    "Timestamp": "1779160294910"
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCustomResourcesCopyJMeterBundle9E5A5E5E": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "Resource": "CopyJMeterBundle",
    "SrcBucket": {
     "Fn::Join": [
      "-",
      [
       "solutions",
       {
        "Ref": "AWS::Region"
       }
      ]
     ]
    },
    "SrcPath": "distributed-load-testing-on-aws/v4.1.0",
    "DestBucket": {
     "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
    },
    "Timestamp": "1779160294911"
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCustomResourcesTestingResourcesConfig0BCA657F": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "TestingResourcesConfig": {
     "region": {
      "Ref": "AWS::Region"
     },
     "subnetA": {
      "Fn::If": [
       "CreateFargateVPCResources",
       {
        "Ref": "DLTVpcDLTSubnetAAE7DDEE8"
       },
       {
        "Ref": "ExistingSubnetA"
       }
      ]
     },
     "subnetB": {
      "Fn::If": [
       "CreateFargateVPCResources",
       {
        "Ref": "DLTVpcDLTSubnetB294F4ED2"
       },
       {
        "Ref": "ExistingSubnetB"
       }
      ]
     },
     "ecsCloudWatchLogGroup": {
      "Ref": "DLTEcsDLTCloudWatchLogsGroupFE9EC144"
     },
     "taskSecurityGroup": {
      "Ref": "DLTEcsDLTEcsSecurityGroup69E6743C"
     },
     "taskDefinition": {
      "Ref": "DLTEcsDLTTaskDefinitionFB4E5564"
     },
     "taskCluster": {
      "Ref": "DLTEcsDLTEcsClusterBC5CE23B"
     },
     "version": "v4.1.0",
     "stackId": {
      "Ref": "AWS::StackId"
     },
     "taskRoleArn": {
      "Fn::GetAtt": [
       "DLTEcsDLTTaskRoleD37E29C5",
       "Arn"
      ]
     },
     "executionRoleArn": {
      "Fn::GetAtt": [
       "DLTEcsDLTTaskExecutionRoleDE668717",
       "Arn"
      ]
     }
    },
    "Resource": "TestingResourcesConfigFile"
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCustomResourcesMetricA23693FA": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "existingVPC": {
     "Fn::If": [
      "BoolExistingVPC",
      true,
      false
     ]
    },
    "Region": {
     "Ref": "AWS::Region"
    },
    "Resource": "Metric",
    "SolutionId": {
     "Fn::FindInMap": [
      "Solution",
      "Config",
      "SolutionId"
     ]
    },
    "UUID": {
     "Fn::GetAtt": [
      "DLTCustomResourcesCustomResourceUuidD1C03F15",
      "UUID"
     ]
    },
    "Version": {
     "Fn::FindInMap": [
      "Solution",
      "Config",
      "CodeVersion"
     ]
    },
    "AccountId": {
     "Ref": "AWS::AccountId"
    },
    "AutoUpdateContainerImage": {
     "Ref": "UseStableTagging"
    },
    "DeployMcpServer": {
     "Ref": "DeployMCPServer"
    }
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTEcsDLTEcsClusterBC5CE23B": {
   "Type": "AWS::ECS::Cluster",
   "Properties": {
    "ClusterName": {
     "Ref": "AWS::StackName"
    },
    "ClusterSettings": [
     {
      "Name": "containerInsights",
      "Value": "enabled"
     }
    ],
    "Tags": [
     {
      "Key": "CloudFormation Stack",
      "Value": {
       "Ref": "AWS::StackName"
      }
     },
     {
      "Key": "SolutionId",
      "Value": "SO0062"
     }
    ]
   }
  },
  "DLTEcsDLTTaskExecutionRoleDE668717": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "ecr:GetAuthorizationToken",
          "ecr:BatchCheckLayerAvailability",
          "ecr:GetDownloadUrlForLayer",
          "ecr:BatchGetImage",
          "logs:CreateLogStream",
          "logs:PutLogEvents"
         ],
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "ECSTaskExecutionPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_POLICYDOCUMENT_NO_WILDCARD_RESOURCE",
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTEcsDLTTaskExecutionRoleDefaultPolicy3A93A204": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTEcsDLTCloudWatchLogsGroupFE9EC144",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTEcsDLTTaskExecutionRoleDefaultPolicy3A93A204",
    "Roles": [
     {
      "Ref": "DLTEcsDLTTaskExecutionRoleDE668717"
     }
    ]
   }
  },
  "DLTEcsDLTTaskRoleD37E29C5": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "s3:HeadObject",
          "s3:PutObject",
          "s3:GetObject",
          "s3:ListBucket"
         ],
         "Effect": "Allow",
         "Resource": [
          {
           "Fn::Join": [
            "",
            [
             "arn:",
             {
              "Ref": "AWS::Partition"
             },
             ":s3:::",
             {
              "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
             }
            ]
           ]
          },
          {
           "Fn::Join": [
            "",
            [
             "arn:",
             {
              "Ref": "AWS::Partition"
             },
             ":s3:::",
             {
              "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
             },
             "/*"
            ]
           ]
          }
         ]
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "ScenariosS3Policy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_POLICYDOCUMENT_NO_WILDCARD_RESOURCE",
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTEcsDLTCloudWatchLogsGroupFE9EC144": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "RetentionInDays": 3653,
    "Tags": [
     {
      "Key": "SolutionId",
      "Value": "SO0062"
     }
    ]
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W84",
       "reason": "KMS encryption unnecessary for log group"
      }
     ]
    }
   }
  },
  "DLTEcsDLTCloudWatchLogsGroupECSLogSubscriptionFilterCanInvokeLambdaF6EFF73B": {
   "Type": "AWS::Lambda::Permission",
   "Properties": {
    "Action": "lambda:InvokeFunction",
    "FunctionName": {
     "Fn::GetAtt": [
      "RealTimeDataRealTimeDataPublisherNew82D06000",
      "Arn"
     ]
    },
    "Principal": "logs.amazonaws.com",
    "SourceArn": {
     "Fn::GetAtt": [
      "DLTEcsDLTCloudWatchLogsGroupFE9EC144",
      "Arn"
     ]
    }
   }
  },
  "DLTEcsDLTCloudWatchLogsGroupECSLogSubscriptionFilterC5BB4DB5": {
   "Type": "AWS::Logs::SubscriptionFilter",
   "Properties": {
    "DestinationArn": {
     "Fn::GetAtt": [
      "RealTimeDataRealTimeDataPublisherNew82D06000",
      "Arn"
     ]
    },
    "FilterPattern": "\"INFO: Current:\" \"live=true\"",
    "LogGroupName": {
     "Ref": "DLTEcsDLTCloudWatchLogsGroupFE9EC144"
    }
   },
   "DependsOn": [
    "DLTEcsDLTCloudWatchLogsGroupECSLogSubscriptionFilterCanInvokeLambdaF6EFF73B"
   ]
  },
  "DLTEcsMetricFilterCountAlarm6B9438DB": {
   "Type": "AWS::CloudWatch::Alarm",
   "Properties": {
    "AlarmDescription": "Alarm when metric filter count approaches the limit of 100",
    "AlarmName": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-MetricFilterCount-Alarm"
      ]
     ]
    },
    "ComparisonOperator": "GreaterThanOrEqualToThreshold",
    "Dimensions": [
     {
      "Name": "LogGroupName",
      "Value": {
       "Ref": "DLTEcsDLTCloudWatchLogsGroupFE9EC144"
      }
     }
    ],
    "EvaluationPeriods": 1,
    "MetricName": "MetricFilterCount",
    "Namespace": "distributed-load-testing",
    "Period": 300,
    "Statistic": "Maximum",
    "Threshold": 90,
    "TreatMissingData": "notBreaching"
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CFN_NO_EXPLICIT_RESOURCE_NAMES"
     ]
    }
   }
  },
  "DLTEcsDLTTaskDefinitionFB4E5564": {
   "Type": "AWS::ECS::TaskDefinition",
   "Properties": {
    "ContainerDefinitions": [
     {
      "Environment": [
       {
        "Name": "JVM_ARGS",
        "Value": "-Xms1g -Xmx3g"
       }
      ],
      "Essential": true,
      "HealthCheck": {
       "Command": [
        "CMD-SHELL",
        "test -f /tmp/health_ready || exit 1"
       ],
       "Interval": 5,
       "Retries": 10,
       "StartPeriod": 10,
       "Timeout": 5
      },
      "Image": {
       "Fn::If": [
        "UseStableTagCondition",
        "public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-load-tester:v4.1_stable",
        "public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-load-tester:v4.1.0"
       ]
      },
      "LogConfiguration": {
       "LogDriver": "awslogs",
       "Options": {
        "awslogs-group": {
         "Ref": "DLTEcsDLTCloudWatchLogsGroupFE9EC144"
        },
        "awslogs-stream-prefix": "load-testing",
        "awslogs-region": {
         "Ref": "AWS::Region"
        }
       }
      },
      "Memory": 4096,
      "Name": {
       "Fn::Join": [
        "",
        [
         {
          "Ref": "AWS::StackName"
         },
         "-load-tester"
        ]
       ]
      }
     }
    ],
    "Cpu": "2048",
    "ExecutionRoleArn": {
     "Fn::GetAtt": [
      "DLTEcsDLTTaskExecutionRoleDE668717",
      "Arn"
     ]
    },
    "Family": "distributedloadtestingonawsalbecsDLTEcsDLTTaskDefinitionE9DE00A1",
    "Memory": "4096",
    "NetworkMode": "awsvpc",
    "RequiresCompatibilities": [
     "FARGATE"
    ],
    "Tags": [
     {
      "Key": "SolutionId",
      "Value": "SO0062"
     }
    ],
    "TaskRoleArn": {
     "Fn::GetAtt": [
      "DLTEcsDLTTaskRoleD37E29C5",
      "Arn"
     ]
    }
   }
  },
  "DLTEcsDLTEcsSecurityGroup69E6743C": {
   "Type": "AWS::EC2::SecurityGroup",
   "Properties": {
    "GroupDescription": "DLTS Tasks Security Group",
    "VpcId": {
     "Fn::If": [
      "CreateFargateVPCResources",
      {
       "Ref": "DLTVpcDLTFargateVpc0E6FEAB7"
      },
      {
       "Ref": "ExistingVPCId"
      }
     ]
    }
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W40",
       "reason": "IpProtocol set to -1 (any) as ports are not known prior to running tests"
      },
      {
       "id": "F1000",
       "reason": "egress rule is specificed as its own cfn resource."
      }
     ]
    }
   }
  },
  "DLTEcsDLTSecGroupEgressE1DA93E8": {
   "Type": "AWS::EC2::SecurityGroupEgress",
   "Properties": {
    "CidrIp": {
     "Ref": "EgressCidr"
    },
    "Description": "Allow tasks to call out to external resources",
    "GroupId": {
     "Ref": "DLTEcsDLTEcsSecurityGroup69E6743C"
    },
    "IpProtocol": "-1"
   }
  },
  "RealTimeDatarealTimeDataPublisherRoleA8976D01": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "iot:Publish",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":iot:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":topic/dlt/*"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "IoTPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "RealTimeDataRealTimeDataPublisherNew82D06000": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/1b2e70389c12c69e12b67c471b5626cd60ed08cfee99c27e5d8263adb2cac092.zip"
    },
    "Description": "Real time data publisher",
    "Environment": {
     "Variables": {
      "MAIN_REGION": {
       "Ref": "AWS::Region"
      },
      "IOT_ENDPOINT": {
       "Fn::Join": [
        "",
        [
         "https://",
         {
          "Fn::GetAtt": [
           "DLTCustomResourcesGetIotEndpoint700ABCC8",
           "IOT_ENDPOINT"
          ]
         }
        ]
       ]
      },
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0"
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "RealTimeDatarealTimeDataPublisherRoleA8976D01",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 180
   },
   "DependsOn": [
    "RealTimeDatarealTimeDataPublisherRoleA8976D01"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "RealTimeDataRealTimeDataPublisherLogGroup3FE55F9A": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "RealTimeDataRealTimeDataPublisherNew82D06000"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W84",
       "reason": "KMS encryption unnecessary for log group"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionLambdaResultsRole2CF2D707": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    }
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W12",
       "reason": "The action does not support resource level permissions."
      }
     ]
    },
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionLambdaResultsPolicyB191FC35": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "cloudwatch:GetMetricWidgetImage",
       "Effect": "Allow",
       "Resource": "*"
      },
      {
       "Action": "logs:DeleteMetricFilter",
       "Condition": {
        "StringEquals": {
         "aws:ResourceTag/SolutionId": "SO0062"
        }
       },
       "Effect": "Allow",
       "Resource": "*"
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTLambdaFunctionLambdaResultsPolicyB191FC35",
    "Roles": [
     {
      "Ref": "DLTLambdaFunctionLambdaResultsRole2CF2D707"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W12",
       "reason": "The action does not support resource level permissions."
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionResultsParserNew4A490450": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/d8a545d9730e5088dd4e99309ca9eb2a58f7ea5870bb8722cebc2d1c5621d4fe.zip"
    },
    "Description": "Result parser for indexing xml test results to DynamoDB",
    "Environment": {
     "Variables": {
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      },
      "HISTORY_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC"
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "SCENARIOS_BUCKET": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "SOLUTION_ID": "SO0062",
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "VERSION": "v4.1.0"
     }
    },
    "Handler": "index.handler",
    "MemorySize": 1024,
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionLambdaResultsRole2CF2D707",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 900
   },
   "DependsOn": [
    "DLTLambdaFunctionLambdaResultsRole2CF2D707"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionResultsParserLambdaLogGroupADF0ADEA": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionResultsParserNew4A490450"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W84",
       "reason": "KMS encryption unnecessary for log group"
      }
     ]
    },
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "ecs:DescribeTaskDefinition",
          "ecs:DeregisterTaskDefinition",
          "ecs:ListTaskDefinitions",
          "ecs:ListTasks"
         ],
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "EcsUnscopedActionsPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "ecs:RegisterTaskDefinition",
          "ecs:DeleteTaskDefinitions",
          "ecs:RunTask",
          "ecs:DescribeTasks",
          "ecs:TagResource",
          "ecs:CreateService",
          "ecs:UpdateService",
          "ecs:DeleteService",
          "ecs:DescribeServices",
          "logs:PutMetricFilter",
          "logs:DescribeMetricFilters"
         ],
         "Condition": {
          "StringEquals": {
           "aws:ResourceTag/SolutionId": "SO0062"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "EcsTagScopedPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "cloudwatch:PutMetricData",
         "Condition": {
          "StringEquals": {
           "cloudwatch:namespace": "distributed-load-testing"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "CloudWatchMetricPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "s3:PutObject",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            {
             "Fn::GetAtt": [
              "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
              "Arn"
             ]
            },
            "/*"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "S3WritePolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "iam:PassRole",
         "Condition": {
          "StringEquals": {
           "iam:PassedToService": "ecs-tasks.amazonaws.com"
          }
         },
         "Effect": "Allow",
         "Resource": [
          {
           "Fn::GetAtt": [
            "DLTEcsDLTTaskExecutionRoleDE668717",
            "Arn"
           ]
          },
          {
           "Fn::GetAtt": [
            "DLTEcsDLTTaskRoleD37E29C5",
            "Arn"
           ]
          }
         ]
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "IamPassRolePolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "cloudwatch:PutDashboard",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":cloudwatch::",
            {
             "Ref": "AWS::AccountId"
            },
            ":dashboard/EcsLoadTesting*"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "CloudWatchDashboardPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "ecs:ListTasks does not support resource level permissions"
      }
     ]
    },
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskRunnerNew5AE1A3C2": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/0edc882aeda2c73090b3c7d938701918163665528dd49cd8960065193155bc55.zip"
    },
    "Description": "Task runner for ECS task definitions",
    "Environment": {
     "Variables": {
      "SCENARIOS_BUCKET": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "MAIN_STACK_REGION": {
       "Ref": "AWS::Region"
      },
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 900
   },
   "DependsOn": [
    "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskRunnerLambdaLogGroupF801BE82": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionTaskRunnerNew5AE1A3C2"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "dynamodb:UpdateItem",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
           "Arn"
          ]
         }
        },
        {
         "Action": "dynamodb:PutItem",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTHistoryTable46D850CC",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "DynamoDbPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskCancelerNewA6986F4A": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/da2fde252c8e0b048bc7ef31e671ac4eace6e0c35de1d0b83511ad5174c9cc2c.zip"
    },
    "Description": "Coordinates test cancellation — sets CANCELLING status, invokes test-cleanup per region",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "HISTORY_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC"
      },
      "TEST_CLEANUP_ARN": {
       "Fn::GetAtt": [
        "DLTLambdaFunctionTestCleanupBBAA461F",
        "Arn"
       ]
      },
      "STATE_MACHINE_ARN": {
       "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
      },
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 300
   },
   "DependsOn": [
    "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskCancellerLambdaLogGroupBD1D284E": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionTaskCancelerNewA6986F4A"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskCancelerInvokePolicyA1C7562A": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTaskCancelerNewA6986F4A",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTLambdaFunctionTaskCancelerInvokePolicyA1C7562A",
    "Roles": [
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   }
  },
  "DLTLambdaFunctionTaskStatusRole9288E645": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "ecs:ListTasks",
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "EcsUnscopedActionsPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "ecs:DescribeTasks",
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": "s3:ListBucket",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "TaskStatusPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "ecs:ListTasks does not support resource level permissions"
      }
     ]
    },
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskStatusCheckerNew00D99653": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/608737227e38a79d761373c98b42f2d03a8389298b6599dc145217a08918ae30.zip"
    },
    "Description": "Task status checker — running check and S3 completion monitoring",
    "Environment": {
     "Variables": {
      "SCENARIOS_BUCKET": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "MAIN_STACK_REGION": {
       "Ref": "AWS::Region"
      },
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionTaskStatusRole9288E645",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 300
   },
   "DependsOn": [
    "DLTLambdaFunctionTaskStatusRole9288E645"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctiontaskStatusCheckerLambdaLogGroup1988969D": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionTaskStatusCheckerNew00D99653"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionTestCleanupRoleDC0BEA52": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "ecs:DeregisterTaskDefinition",
          "ecs:ListTaskDefinitions",
          "ecs:ListTasks"
         ],
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "EcsUnscopedActionsPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "ecs:UpdateService",
          "ecs:DeleteService",
          "ecs:DescribeServices",
          "ecs:DeleteTaskDefinitions"
         ],
         "Condition": {
          "StringEquals": {
           "aws:ResourceTag/SolutionId": "SO0062"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "EcsTagScopedPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "logs:DescribeMetricFilters",
          "logs:DeleteMetricFilter"
         ],
         "Condition": {
          "StringEquals": {
           "aws:ResourceTag/SolutionId": "SO0062"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "MetricFilterPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "cloudwatch:PutMetricData",
         "Condition": {
          "StringEquals": {
           "cloudwatch:namespace": "distributed-load-testing"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "CloudWatchMetricPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "dynamodb:UpdateItem",
         "Effect": "Allow",
         "Resource": [
          {
           "Fn::GetAtt": [
            "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
            "Arn"
           ]
          },
          {
           "Fn::GetAtt": [
            "DLTTestRunnerStorageDLTHistoryTable46D850CC",
            "Arn"
           ]
          }
         ]
        },
        {
         "Action": "dynamodb:PutItem",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTHistoryTable46D850CC",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "DynamoDbPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "ecs:ListTasks and ecs:DeregisterTaskDefinition do not support resource level permissions"
      }
     ]
    },
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionTestCleanupBBAA461F": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/42ffb393d418edee85506c84f539365861bbe514c1d5fdb0e32783865f6ea7bd.zip"
    },
    "Description": "Cleans up ECS resources for one region and sets final DDB status",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "HISTORY_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC"
      },
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionTestCleanupRoleDC0BEA52",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 900
   },
   "DependsOn": [
    "DLTLambdaFunctionTestCleanupRoleDC0BEA52"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionTestCleanupLambdaLogGroupC7B4FECA": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionTestCleanupBBAA461F"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionTestCleanupInvokePolicyA8E77925": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestCleanupBBAA461F",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTLambdaFunctionTestCleanupInvokePolicyA8E77925",
    "Roles": [
     {
      "Ref": "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF"
     }
    ]
   }
  },
  "DLTLambdaFunctionStabilizationCheckerRole6CBA6344": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "ecs:DescribeServices",
         "Condition": {
          "StringEquals": {
           "aws:ResourceTag/SolutionId": "SO0062"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "EcsTagScopedPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK",
      "IAM_POLICYDOCUMENT_NO_WILDCARD_RESOURCE"
     ]
    }
   }
  },
  "DLTLambdaFunctionStabilizationChecker9DA790EC": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/06431f39505dee20468fe8c33677e0880cb810cbe3502e5a4b91c42881535fba.zip"
    },
    "Description": "Checks ECS service stabilization status",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionStabilizationCheckerRole6CBA6344",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 60
   },
   "DependsOn": [
    "DLTLambdaFunctionStabilizationCheckerRole6CBA6344"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionStabilizationCheckerLambdaLogGroup42149834": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionStabilizationChecker9DA790EC"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionStartCommandRole3F343C56": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "s3:PutObject",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            {
             "Fn::GetAtt": [
              "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
              "Arn"
             ]
            },
            "/start-signal/*"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "S3StartSignalPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionStartCommand206D87C5": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/d9e8b6cdb35ca999803dd3db6b6b73fc0ef1babfb47e89b6dd3a7b3c34af07f5.zip"
    },
    "Description": "Writes S3 start marker so ECS tasks begin test execution",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "SCENARIOS_BUCKET": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "MAIN_STACK_REGION": {
       "Ref": "AWS::Region"
      },
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionStartCommandRole3F343C56",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 60
   },
   "DependsOn": [
    "DLTLambdaFunctionStartCommandRole3F343C56"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionStartCommandLambdaLogGroupB730B794": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionStartCommand206D87C5"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionRegionalSyncRole8A668DCC": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "dynamodb:UpdateItem",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "RegionalSyncPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionRegionalSyncEF230066": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/f2ba3a7fe645fe4a02db058e4eca6d9fcd382b71d799fb5d5b57922f00f00dce.zip"
    },
    "Description": "Validates all regions are READY and emits sync metric",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionRegionalSyncRole8A668DCC",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 30
   },
   "DependsOn": [
    "DLTLambdaFunctionRegionalSyncRole8A668DCC"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionRegionalSyncLambdaLogGroup303B7022": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionRegionalSyncEF230066"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskFailureHandlerRoleB2F5047C": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "dynamodb:UpdateItem",
          "dynamodb:GetItem"
         ],
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "TaskFailureHandlerPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "cloudwatch:PutMetricData",
         "Condition": {
          "StringEquals": {
           "cloudwatch:namespace": "distributed-load-testing"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "CloudWatchMetricPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK",
      "IAM_POLICYDOCUMENT_NO_WILDCARD_RESOURCE"
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskFailureHandlerCB3B514D": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/a3284b91035a950557e827367e539363eb690dccef942bf5204286958a832e98.zip"
    },
    "Description": "Handles ECS task failure events and tracks failure threshold",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionTaskFailureHandlerRoleB2F5047C",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 30
   },
   "DependsOn": [
    "DLTLambdaFunctionTaskFailureHandlerRoleB2F5047C"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskFailureHandlerLambdaLogGroupE7AB6C96": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionTaskFailureHandlerCB3B514D"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionECSTaskStoppedRule2D661D34": {
   "Type": "AWS::Events::Rule",
   "Properties": {
    "Description": "Routes ECS task STOPPED events to the Task Failure Handler for threshold tracking",
    "EventPattern": {
     "source": [
      "aws.ecs"
     ],
     "detail-type": [
      "ECS Task State Change"
     ],
     "detail": {
      "lastStatus": [
       "STOPPED"
      ]
     }
    },
    "State": "ENABLED",
    "Targets": [
     {
      "Arn": {
       "Fn::GetAtt": [
        "DLTLambdaFunctionTaskFailureHandlerCB3B514D",
        "Arn"
       ]
      },
      "Id": "Target0"
     }
    ]
   }
  },
  "DLTLambdaFunctionECSTaskStoppedRuleAllowEventRuledistributedloadtestingonawsalbecsDLTLambdaFunctionTaskFailureHandlerC8698B2B1E8C72FF": {
   "Type": "AWS::Lambda::Permission",
   "Properties": {
    "Action": "lambda:InvokeFunction",
    "FunctionName": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionTaskFailureHandlerCB3B514D",
      "Arn"
     ]
    },
    "Principal": "events.amazonaws.com",
    "SourceArn": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionECSTaskStoppedRule2D661D34",
      "Arn"
     ]
    }
   }
  },
  "DLTLambdaFunctionOrphanCleanupRoleB4AD3115": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "ecs:ListServices",
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": [
          "ecs:DescribeServices",
          "ecs:UpdateService",
          "ecs:DeleteService"
         ],
         "Condition": {
          "StringEquals": {
           "aws:ResourceTag/SolutionId": "SO0062"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": "cloudwatch:PutMetricData",
         "Condition": {
          "StringEquals": {
           "cloudwatch:namespace": "distributed-load-testing"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": "dynamodb:Scan",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "OrphanCleanupPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "ecs:ListServices does not support resource level permissions"
      }
     ]
    },
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionOrphanCleanup13860457": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/c2463582fef47f44c245ea42c36b60d52bc77cd655c04a64f750afd3458bd0dc.zip"
    },
    "Description": "Hourly scan for orphaned ECS services not associated with active tests",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "STATE_MACHINE_ARN": {
       "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionOrphanCleanupRoleB4AD3115",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 900
   },
   "DependsOn": [
    "DLTLambdaFunctionOrphanCleanupRoleB4AD3115"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionOrphanCleanupLambdaLogGroupE96F9900": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionOrphanCleanup13860457"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionOrphanCleanupScheduleRuleF6705350": {
   "Type": "AWS::Events::Rule",
   "Properties": {
    "Description": "Hourly trigger for orphaned ECS service cleanup",
    "ScheduleExpression": "rate(1 hour)",
    "State": "ENABLED",
    "Targets": [
     {
      "Arn": {
       "Fn::GetAtt": [
        "DLTLambdaFunctionOrphanCleanup13860457",
        "Arn"
       ]
      },
      "Id": "Target0"
     }
    ]
   }
  },
  "DLTLambdaFunctionOrphanCleanupScheduleRuleAllowEventRuledistributedloadtestingonawsalbecsDLTLambdaFunctionOrphanCleanupBCDA16655EE57D54": {
   "Type": "AWS::Lambda::Permission",
   "Properties": {
    "Action": "lambda:InvokeFunction",
    "FunctionName": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionOrphanCleanup13860457",
      "Arn"
     ]
    },
    "Principal": "events.amazonaws.com",
    "SourceArn": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionOrphanCleanupScheduleRuleF6705350",
      "Arn"
     ]
    }
   }
  },
  "DLTLambdaFunctionOrphanCleanupFailureAlarmE755678A": {
   "Type": "AWS::CloudWatch::Alarm",
   "Properties": {
    "AlarmDescription": "Alerts when orphan ECS service cleanup fails. Manual intervention required to delete orphaned services and prevent ongoing Fargate charges.",
    "AlarmName": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-OrphanCleanupFailure"
      ]
     ]
    },
    "ComparisonOperator": "GreaterThanOrEqualToThreshold",
    "Dimensions": [
     {
      "Name": "SolutionId",
      "Value": "SO0062"
     }
    ],
    "EvaluationPeriods": 1,
    "MetricName": "OrphanCleanupFailures",
    "Namespace": "distributed-load-testing",
    "Period": 300,
    "Statistic": "Sum",
    "Threshold": 1,
    "TreatMissingData": "breaching"
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CFN_NO_EXPLICIT_RESOURCE_NAMES"
     ]
    }
   }
  },
  "DLTLambdaFunctionSFNFailureHandlerRole383D70B7": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "lambda:InvokeFunction",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTLambdaFunctionTestCleanupBBAA461F",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "SFNFailureHandlerPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionSFNFailureHandler928EB56D": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/ab91522c563e91fcc3bf763bb21ad4c75e857e96a60d6d51095164451a2da428.zip"
    },
    "Description": "Layer 2 safety: invokes test-cleanup when step function fails",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "TEST_CLEANUP_ARN": {
       "Fn::GetAtt": [
        "DLTLambdaFunctionTestCleanupBBAA461F",
        "Arn"
       ]
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionSFNFailureHandlerRole383D70B7",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 120
   },
   "DependsOn": [
    "DLTLambdaFunctionSFNFailureHandlerRole383D70B7"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionSFNFailureHandlerLambdaLogGroup967B3D84": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionSFNFailureHandler928EB56D"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionMetricsEmitterRole7DF7406A": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    }
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionMetricsEmitterD0894A67": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/0e9e25c5bddd1d9e636b841267ee2d66a91b60b66f5858528bf9c2d38baaa82e.zip"
    },
    "Description": "Sends operational metrics for test lifecycle events",
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionMetricsEmitterRole7DF7406A",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 15
   },
   "DependsOn": [
    "DLTLambdaFunctionMetricsEmitterRole7DF7406A"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "MetricsEmitterLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionMetricsEmitterLambdaLogGroup3CB505DB": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionMetricsEmitterD0894A67"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionMetricsEmitterLogsPolicy2C69A721": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionMetricsEmitterLambdaLogGroup3CB505DB",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTLambdaFunctionMetricsEmitterLogsPolicy2C69A721",
    "Roles": [
     {
      "Ref": "DLTLambdaFunctionMetricsEmitterRole7DF7406A"
     }
    ]
   }
  },
  "DLTLambdaFunctionTestStatusUpdaterRole997B3321": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "dynamodb:GetItem",
          "dynamodb:UpdateItem"
         ],
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
           "Arn"
          ]
         }
        },
        {
         "Action": "dynamodb:UpdateItem",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTHistoryTable46D850CC",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "DynamoDbPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionTestStatusUpdater5E9CDE77": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/507e5ba723596bec5b972f499ae1289cab0a37ede64fe923eddd59580f184ab2.zip"
    },
    "Description": "Updates scenario and history DynamoDB records with current test status",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "HISTORY_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionTestStatusUpdaterRole997B3321",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 30
   },
   "DependsOn": [
    "DLTLambdaFunctionTestStatusUpdaterRole997B3321"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionTestStatusUpdaterLambdaLogGroup7BB4B4CD": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionTestStatusUpdater5E9CDE77"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTStepFunctionStepFunctionsLogGroup8DABDAB7": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/vendedlogs/states/StepFunctionsLogGroup",
       {
        "Ref": "AWS::StackName"
       },
       {
        "Fn::GetAtt": [
         "DLTCustomResourcesCustomResourceUuidD1C03F15",
         "SUFFIX"
        ]
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W84",
       "reason": "KMS encryption unnecessary for log group"
      }
     ]
    }
   }
  },
  "DLTStepFunctionTaskRunnerStepFunctionsRoleC2237F06": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "states.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    }
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "CloudWatch logs actions do not support resource level permissions"
      },
      {
       "id": "W12",
       "reason": "CloudWatch logs actions do not support resource level permissions"
      }
     ]
    }
   }
  },
  "DLTStepFunctionTaskRunnerStepFunctionsRoleDefaultPolicy8F17B49F": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionMetricsEmitterD0894A67",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionMetricsEmitterD0894A67",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionRegionalSyncEF230066",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionRegionalSyncEF230066",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionTestStatusUpdater5E9CDE77",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionTestStatusUpdater5E9CDE77",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionResultsParserNew4A490450",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionResultsParserNew4A490450",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionStartCommand206D87C5",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionStartCommand206D87C5",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionTaskStatusCheckerNew00D99653",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionTaskStatusCheckerNew00D99653",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionTestCleanupBBAA461F",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionTestCleanupBBAA461F",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionTaskRunnerNew5AE1A3C2",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionTaskRunnerNew5AE1A3C2",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionStabilizationChecker9DA790EC",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionStabilizationChecker9DA790EC",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": [
        "logs:CreateLogDelivery",
        "logs:GetLogDelivery",
        "logs:UpdateLogDelivery",
        "logs:DeleteLogDelivery",
        "logs:ListLogDeliveries",
        "logs:PutResourcePolicy",
        "logs:DescribeResourcePolicies",
        "logs:DescribeLogGroups"
       ],
       "Effect": "Allow",
       "Resource": "*"
      },
      {
       "Action": [
        "xray:PutTraceSegments",
        "xray:PutTelemetryRecords",
        "xray:GetSamplingRules",
        "xray:GetSamplingTargets"
       ],
       "Effect": "Allow",
       "Resource": "*"
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTStepFunctionTaskRunnerStepFunctionsRoleDefaultPolicy8F17B49F",
    "Roles": [
     {
      "Ref": "DLTStepFunctionTaskRunnerStepFunctionsRoleC2237F06"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W12",
       "reason": "CloudWatch logs actions do not support resource level permissions"
      },
      {
       "id": "W76",
       "reason": "The IAM policy is written for least-privilege access."
      }
     ]
    }
   }
  },
  "DLTStepFunctionTaskRunnerStepFunctionsC295A535": {
   "Type": "AWS::StepFunctions::StateMachine",
   "Properties": {
    "DefinitionString": {
     "Fn::Join": [
      "",
      [
       "{\"StartAt\":\"TestStart\",\"States\":{\"TestStart\":{\"Next\":\"Stabilization Map\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":null,\"Next\":\"Stabilization Map\"}],\"Type\":\"Task\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionMetricsEmitterD0894A67",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"solutionId\":\"SO0062\",\"uuid\":\"",
       {
        "Fn::GetAtt": [
         "DLTCustomResourcesCustomResourceUuidD1C03F15",
         "UUID"
        ]
       },
       "\",\"version\":\"v4.1.0\",\"metricUrl\":\"https://metrics.awssolutionsbuilder.com/generic\",\"accountId\":\"",
       {
        "Ref": "AWS::AccountId"
       },
       "\",\"metricSchemaVersion\":1,\"data\":{\"Type\":\"TestStart\",\"TestId.$\":\"$.testId\",\"TestType.$\":\"$.testType\",\"FileType.$\":\"$.fileType\",\"TestDuration.$\":\"$.testDuration\",\"RegionCount.$\":\"States.ArrayLength($.testTaskConfig)\"}}}},\"Stabilization Map\":{\"Type\":\"Map\",\"ResultPath\":\"$.stabilizationResults\",\"Next\":\"Regional Sync\",\"InputPath\":\"$\",\"ItemsPath\":\"$.testTaskConfig\",\"ItemSelector\":{\"testTaskConfig.$\":\"$$.Map.Item.Value\",\"testId.$\":\"$.testId\",\"testType.$\":\"$.testType\",\"fileType.$\":\"$.fileType\",\"showLive.$\":\"$.showLive\",\"testDuration.$\":\"$.testDuration\",\"prefix.$\":\"$.prefix\",\"testRunId.$\":\"$.testRunId\",\"hubTaskDefinition.$\":\"$.hubTaskDefinition\"},\"ItemProcessor\":{\"ProcessorConfig\":{\"Mode\":\"INLINE\"},\"StartAt\":\"Check Running Tests\",\"States\":{\"Check Running Tests\":{\"Next\":\"Test already running?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.error\",\"Next\":\"Prepare Phase 1 Failure Cleanup\"}],\"Type\":\"Task\",\"InputPath\":\"$\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTaskStatusCheckerNew00D99653",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}},\"Test already running?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.isRunning\",\"BooleanEquals\":true,\"Next\":\"Test Already Running End\"}],\"Default\":\"Task Runner\"},\"Task Runner\":{\"Next\":\"Check Stabilization\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.error\",\"Next\":\"Prepare Phase 1 Failure Cleanup\"}],\"Type\":\"Task\",\"InputPath\":\"$\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTaskRunnerNew5AE1A3C2",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}},\"Check Stabilization\":{\"Next\":\"Service stable?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.error\",\"Next\":\"Prepare Phase 1 Failure Cleanup\"}],\"Type\":\"Task\",\"InputPath\":\"$\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionStabilizationChecker9DA790EC",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}},\"Wait 10s - stabilization\":{\"Type\":\"Wait\",\"Seconds\":10,\"Next\":\"Check Stabilization\"},\"Service stable?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.status\",\"StringEquals\":\"READY\",\"Next\":\"Phase 1 Map End\"},{\"Variable\":\"$.status\",\"StringEquals\":\"FAILED\",\"Next\":\"Phase 1 Map End\"}],\"Default\":\"Wait 10s - stabilization\"},\"Phase 1 Map End\":{\"Type\":\"Pass\",\"End\":true},\"Phase 1 Error Cleanup\":{\"Next\":\"Phase 1 Map End\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"InputPath\":\"$\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestCleanupBBAA461F",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}},\"Prepare Phase 1 Failure Cleanup\":{\"Type\":\"Pass\",\"Parameters\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testTaskConfig.$\":\"$.testTaskConfig\",\"finalStatus\":\"failed\",\"errorReason\":\"ECS service creation or stabilization failed\",\"skipStatusUpdate\":true},\"Next\":\"Phase 1 Error Cleanup\"},\"Test Already Running End\":{\"Type\":\"Pass\",\"Next\":\"Phase 1 Map End\"}}}},\"Regional Sync\":{\"Next\":\"All regions ready?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.error\",\"Next\":\"Cancel All Regions\"}],\"Type\":\"Task\",\"ResultPath\":\"$.syncResult\",\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionRegionalSyncEF230066",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testType.$\":\"$.testType\",\"regions.$\":\"$.stabilizationResults\"}}},\"All regions ready?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.syncResult.Payload.allReady\",\"BooleanEquals\":true,\"Next\":\"Set Status: running\"}],\"Default\":\"Cancel All Regions\"},\"Cancel All Regions\":{\"Type\":\"Map\",\"ResultPath\":null,\"Next\":\"Final Outcome: failed\",\"InputPath\":\"$\",\"ItemsPath\":\"$.stabilizationResults\",\"ItemProcessor\":{\"ProcessorConfig\":{\"Mode\":\"INLINE\"},\"StartAt\":\"Prepare Cancel Cleanup\",\"States\":{\"Prepare Cancel Cleanup\":{\"Type\":\"Pass\",\"Parameters\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testTaskConfig.$\":\"$.testTaskConfig\",\"finalStatus\":\"failed\",\"errorReason\":\"Regional sync failed — at least one region did not stabilize\",\"skipStatusUpdate\":true},\"Next\":\"Cancel Region\"},\"Cancel Region\":{\"End\":true,\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"InputPath\":\"$\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestCleanupBBAA461F",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}}}}},\"Final Outcome: failed\":{\"Type\":\"Pass\",\"Result\":\"failed\",\"ResultPath\":\"$.finalOutcome\",\"Next\":\"TestEnd\"},\"Error Cleanup Map\":{\"Type\":\"Map\",\"ResultPath\":null,\"Next\":\"Final Outcome: failed\",\"InputPath\":\"$\",\"ItemsPath\":\"$.stabilizationResults\",\"ItemProcessor\":{\"ProcessorConfig\":{\"Mode\":\"INLINE\"},\"StartAt\":\"Prepare Error Cleanup\",\"States\":{\"Prepare Error Cleanup\":{\"Type\":\"Pass\",\"Parameters\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testTaskConfig.$\":\"$.testTaskConfig\",\"finalStatus\":\"failed\",\"errorReason\":\"Results parsing failed\",\"skipStatusUpdate\":true},\"Next\":\"Invoke Error Cleanup\"},\"Invoke Error Cleanup\":{\"End\":true,\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"InputPath\":\"$\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestCleanupBBAA461F",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}}}}},\"Test results succeeded?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.executionResult.hasFailures\",\"BooleanEquals\":true,\"Next\":\"Error Cleanup Map\"},{\"Variable\":\"$.error\",\"IsPresent\":true,\"Next\":\"Error Cleanup Map\"}],\"Default\":\"Cleanup Map\"},\"Set Status: cleaning up\":{\"Next\":\"Test results succeeded?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestStatusUpdater5E9CDE77",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"status\":\"cleaning up\"}}},\"Parse Results\":{\"Next\":\"Set Status: cleaning up\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.error\",\"Next\":\"Set Status: cleaning up\"}],\"Type\":\"Task\",\"ResultPath\":\"$.parseResult\",\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionResultsParserNew4A490450",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"testTaskConfig.$\":\"$.testTaskConfig\",\"testId.$\":\"$.testId\",\"testType.$\":\"$.testType\",\"fileType.$\":\"$.fileType\",\"showLive.$\":\"$.showLive\",\"testDuration.$\":\"$.testDuration\",\"prefix.$\":\"$.prefix\",\"testRunId.$\":\"$.testRunId\",\"executionStart.$\":\"$$.Execution.StartTime\"}}},\"Set Status: parsing results\":{\"Next\":\"Parse Results\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestStatusUpdater5E9CDE77",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"status\":\"parsing results\"}}},\"Check For Failures\":{\"Type\":\"Pass\",\"ResultPath\":\"$.executionResult\",\"Parameters\":{\"hasFailures.$\":\"States.ArrayContains($.executionMapResults, 'failed')\"},\"Next\":\"Set Status: parsing results\"},\"Execution Map\":{\"Type\":\"Map\",\"ResultPath\":\"$.executionMapResults\",\"Next\":\"Check For Failures\",\"InputPath\":\"$\",\"ItemsPath\":\"$.stabilizationResults\",\"ItemProcessor\":{\"ProcessorConfig\":{\"Mode\":\"INLINE\"},\"StartAt\":\"Send START Command\",\"States\":{\"Send START Command\":{\"Next\":\"Check Completion\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.error\",\"Next\":\"Prepare Start Command Failure\"}],\"Type\":\"Task\",\"InputPath\":\"$\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionStartCommand206D87C5",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}},\"Check Completion\":{\"Next\":\"Is test complete?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.error\",\"Next\":\"Prepare Completion Monitor Failure\"}],\"Type\":\"Task\",\"InputPath\":\"$\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTaskStatusCheckerNew00D99653",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}},\"Wait 15s - completion\":{\"Type\":\"Wait\",\"Seconds\":15,\"Next\":\"Check Completion\"},\"Is test complete?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.isComplete\",\"BooleanEquals\":true,\"Next\":\"Set Final Status: success\"},{\"Variable\":\"$.timedOut\",\"BooleanEquals\":true,\"Next\":\"Prepare Phase 2 Failure Cleanup\"}],\"Default\":\"Wait 15s - completion\"},\"Set Final Status: success\":{\"Type\":\"Pass\",\"Parameters\":{\"finalStatus\":\"success\"},\"Next\":\"Phase 2 Map End\"},\"Phase 2 Map End\":{\"Type\":\"Pass\",\"OutputPath\":\"$.finalStatus\",\"End\":true},\"Phase 2 Error Cleanup\":{\"Next\":\"Phase 2 Map End\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"InputPath\":\"$\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestCleanupBBAA461F",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}},\"Prepare Phase 2 Failure Cleanup\":{\"Type\":\"Pass\",\"Parameters\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testTaskConfig.$\":\"$.testTaskConfig\",\"finalStatus\":\"failed\",\"errorReason.$\":\"$.errorReason\",\"skipStatusUpdate\":true},\"Next\":\"Phase 2 Error Cleanup\"},\"Prepare Completion Monitor Failure\":{\"Type\":\"Pass\",\"Parameters\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testTaskConfig.$\":\"$.testTaskConfig\",\"finalStatus\":\"failed\",\"errorReason\":\"Completion monitoring failed\",\"skipStatusUpdate\":true},\"Next\":\"Phase 2 Error Cleanup\"},\"Prepare Start Command Failure\":{\"Type\":\"Pass\",\"Parameters\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testTaskConfig.$\":\"$.testTaskConfig\",\"finalStatus\":\"failed\",\"errorReason\":\"Failed to send start command\",\"skipStatusUpdate\":true},\"Next\":\"Phase 2 Error Cleanup\"}}}},\"Set Status: running\":{\"Next\":\"Execution Map\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestStatusUpdater5E9CDE77",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"status\":\"running\"}}},\"Cleanup Map\":{\"Type\":\"Map\",\"ResultPath\":null,\"Next\":\"Final Outcome: complete\",\"InputPath\":\"$\",\"ItemsPath\":\"$.stabilizationResults\",\"ItemProcessor\":{\"ProcessorConfig\":{\"Mode\":\"INLINE\"},\"StartAt\":\"Prepare Complete Cleanup\",\"States\":{\"Prepare Complete Cleanup\":{\"Type\":\"Pass\",\"Parameters\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testTaskConfig.$\":\"$.testTaskConfig\",\"finalStatus\":\"complete\",\"skipStatusUpdate\":true},\"Next\":\"Invoke Test Cleanup\"},\"Invoke Test Cleanup\":{\"End\":true,\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"InputPath\":\"$\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestCleanupBBAA461F",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}}}}},\"Final Outcome: complete\":{\"Type\":\"Pass\",\"Result\":\"complete\",\"ResultPath\":\"$.finalOutcome\",\"Next\":\"TestEnd\"},\"TestEnd\":{\"Next\":\"Set Final Status and Endtime\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":null,\"Next\":\"Set Final Status and Endtime\"}],\"Type\":\"Task\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionMetricsEmitterD0894A67",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"solutionId\":\"SO0062\",\"uuid\":\"",
       {
        "Fn::GetAtt": [
         "DLTCustomResourcesCustomResourceUuidD1C03F15",
         "UUID"
        ]
       },
       "\",\"version\":\"v4.1.0\",\"metricUrl\":\"https://metrics.awssolutionsbuilder.com/generic\",\"accountId\":\"",
       {
        "Ref": "AWS::AccountId"
       },
       "\",\"metricSchemaVersion\":1,\"data\":{\"Type\":\"TestEnd\",\"TestId.$\":\"$.testId\",\"TestType.$\":\"$.testType\",\"FinalStatus.$\":\"$.finalOutcome\"}}}},\"Set Final Status and Endtime\":{\"Next\":\"Done\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestStatusUpdater5E9CDE77",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"status.$\":\"$.finalOutcome\",\"endTime.$\":\"$$.State.EnteredTime\"}}},\"Done\":{\"Type\":\"Succeed\"}}}"
      ]
     ]
    },
    "LoggingConfiguration": {
     "Destinations": [
      {
       "CloudWatchLogsLogGroup": {
        "LogGroupArn": {
         "Fn::GetAtt": [
          "DLTStepFunctionStepFunctionsLogGroup8DABDAB7",
          "Arn"
         ]
        }
       }
      }
     ],
     "IncludeExecutionData": false,
     "Level": "ALL"
    },
    "RoleArn": {
     "Fn::GetAtt": [
      "DLTStepFunctionTaskRunnerStepFunctionsRoleC2237F06",
      "Arn"
     ]
    },
    "TracingConfiguration": {
     "Enabled": true
    }
   },
   "DependsOn": [
    "DLTStepFunctionTaskRunnerStepFunctionsRoleDefaultPolicy8F17B49F",
    "DLTStepFunctionTaskRunnerStepFunctionsRoleC2237F06"
   ],
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTSavedQueriesTestTimeline565856F1": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionTaskRunnerLambdaLogGroupF801BE82"
     },
     {
      "Ref": "DLTLambdaFunctionStabilizationCheckerLambdaLogGroup42149834"
     },
     {
      "Ref": "DLTLambdaFunctiontaskStatusCheckerLambdaLogGroup1988969D"
     },
     {
      "Ref": "DLTLambdaFunctionStartCommandLambdaLogGroupB730B794"
     },
     {
      "Ref": "DLTLambdaFunctionTestCleanupLambdaLogGroupC7B4FECA"
     },
     {
      "Ref": "DLTLambdaFunctionTaskCancellerLambdaLogGroupBD1D284E"
     },
     {
      "Ref": "DLTLambdaFunctionTaskFailureHandlerLambdaLogGroupE7AB6C96"
     },
     {
      "Ref": "DLTLambdaFunctionRegionalSyncLambdaLogGroup303B7022"
     },
     {
      "Ref": "DLTLambdaFunctionOrphanCleanupLambdaLogGroupE96F9900"
     },
     {
      "Ref": "DLTLambdaFunctionSFNFailureHandlerLambdaLogGroup967B3D84"
     },
     {
      "Ref": "DLTLambdaFunctionMetricsEmitterLambdaLogGroup3CB505DB"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       "DLT - Test Timeline [",
       {
        "Ref": "AWS::StackName"
       },
       " ",
       {
        "Ref": "AWS::Region"
       },
       "]"
      ]
     ]
    },
    "QueryString": "fields @timestamp, logEvent, message, region, error\n| filter testRunId = \"REPLACE_WITH_TEST_RUN_ID\"\n| sort @timestamp asc\n| limit 500"
   }
  },
  "DLTSavedQueriesTestErrorsFED798D2": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionTaskRunnerLambdaLogGroupF801BE82"
     },
     {
      "Ref": "DLTLambdaFunctionStabilizationCheckerLambdaLogGroup42149834"
     },
     {
      "Ref": "DLTLambdaFunctiontaskStatusCheckerLambdaLogGroup1988969D"
     },
     {
      "Ref": "DLTLambdaFunctionStartCommandLambdaLogGroupB730B794"
     },
     {
      "Ref": "DLTLambdaFunctionTestCleanupLambdaLogGroupC7B4FECA"
     },
     {
      "Ref": "DLTLambdaFunctionTaskCancellerLambdaLogGroupBD1D284E"
     },
     {
      "Ref": "DLTLambdaFunctionTaskFailureHandlerLambdaLogGroupE7AB6C96"
     },
     {
      "Ref": "DLTLambdaFunctionRegionalSyncLambdaLogGroup303B7022"
     },
     {
      "Ref": "DLTLambdaFunctionOrphanCleanupLambdaLogGroupE96F9900"
     },
     {
      "Ref": "DLTLambdaFunctionSFNFailureHandlerLambdaLogGroup967B3D84"
     },
     {
      "Ref": "DLTLambdaFunctionMetricsEmitterLambdaLogGroup3CB505DB"
     },
     {
      "Ref": "DLTEcsDLTCloudWatchLogsGroupFE9EC144"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       "DLT - Test Errors [",
       {
        "Ref": "AWS::StackName"
       },
       " ",
       {
        "Ref": "AWS::Region"
       },
       "]"
      ]
     ]
    },
    "QueryString": "fields @timestamp, logEvent, message, region, taskId, error\n| filter testRunId = \"REPLACE_WITH_TEST_RUN_ID\" and level = \"ERROR\"\n| sort @timestamp asc"
   }
  },
  "DLTSavedQueriesTaskFailuresC06FB5BD": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionTaskFailureHandlerLambdaLogGroupE7AB6C96"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       "DLT - Task Failures [",
       {
        "Ref": "AWS::StackName"
       },
       " ",
       {
        "Ref": "AWS::Region"
       },
       "]"
      ]
     ]
    },
    "QueryString": "fields @timestamp, testId, testRunId, region, taskArn, stopCode, exitCode, stopCategory, stoppedReason\n| filter logEvent = \"TASK_FAILURE_DETECTED\"\n| sort @timestamp desc\n| limit 50"
   }
  },
  "DLTSavedQueriesOrphanCleanup80C351CE": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionOrphanCleanupLambdaLogGroupE96F9900"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       "DLT - Orphan Cleanup [",
       {
        "Ref": "AWS::StackName"
       },
       " ",
       {
        "Ref": "AWS::Region"
       },
       "]"
      ]
     ]
    },
    "QueryString": "fields @timestamp, logEvent, message, region, cluster, orphanCount, orphanTestIds\n| filter logEvent = \"ORPHAN_DETECTED\"\n| sort @timestamp desc\n| limit 50"
   }
  },
  "TaskCancelerSfnPolicyF898DBC2": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "states:ListExecutions",
       "Effect": "Allow",
       "Resource": {
        "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
       }
      },
      {
       "Action": [
        "states:DescribeExecution",
        "states:StopExecution"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":states:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":execution:",
          {
           "Fn::GetAtt": [
            "DLTStepFunctionTaskRunnerStepFunctionsC295A535",
            "Name"
           ]
          },
          ":*"
         ]
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "TaskCancelerSfnPolicyF898DBC2",
    "Roles": [
     {
      "Ref": "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF"
     }
    ]
   }
  },
  "SFNFailureHandlerSfnPolicy01B40EFA": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "states:DescribeExecution",
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":states:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":execution:",
          {
           "Fn::GetAtt": [
            "DLTStepFunctionTaskRunnerStepFunctionsC295A535",
            "Name"
           ]
          },
          ":*"
         ]
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "SFNFailureHandlerSfnPolicy01B40EFA",
    "Roles": [
     {
      "Ref": "DLTLambdaFunctionSFNFailureHandlerRole383D70B7"
     }
    ]
   }
  },
  "OrphanCleanupSfnPolicy9066FEBC": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "states:ListExecutions",
       "Effect": "Allow",
       "Resource": {
        "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "OrphanCleanupSfnPolicy9066FEBC",
    "Roles": [
     {
      "Ref": "DLTLambdaFunctionOrphanCleanupRoleB4AD3115"
     }
    ]
   }
  },
  "SFNFailureRule770B04D7": {
   "Type": "AWS::Events::Rule",
   "Properties": {
    "Description": "Routes Step Function execution failures to the SFN Failure Handler for ECS cleanup",
    "EventPattern": {
     "source": [
      "aws.states"
     ],
     "detail-type": [
      "Step Functions Execution Status Change"
     ],
     "detail": {
      "status": [
       "FAILED",
       "TIMED_OUT",
       "ABORTED"
      ],
      "stateMachineArn": [
       {
        "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
       }
      ]
     }
    },
    "State": "ENABLED",
    "Targets": [
     {
      "Arn": {
       "Fn::GetAtt": [
        "DLTLambdaFunctionSFNFailureHandler928EB56D",
        "Arn"
       ]
      },
      "Id": "Target0"
     }
    ]
   }
  },
  "SFNFailureRuleAllowEventRuledistributedloadtestingonawsalbecsDLTLambdaFunctionSFNFailureHandler58A08A87D23FCF9A": {
   "Type": "AWS::Lambda::Permission",
   "Properties": {
    "Action": "lambda:InvokeFunction",
    "FunctionName": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionSFNFailureHandler928EB56D",
      "Arn"
     ]
    },
    "Principal": "events.amazonaws.com",
    "SourceArn": {
     "Fn::GetAtt": [
      "SFNFailureRule770B04D7",
      "Arn"
     ]
    }
   }
  },
  "DLTApiDLTAPIServicesLambdaRole4465EAA4": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "ecs:ListTasks",
          "ecs:RunTask",
          "ecs:DescribeTasks",
          "ecs:TagResource",
          "logs:DeleteMetricFilter"
         ],
         "Condition": {
          "StringEquals": {
           "aws:ResourceTag/SolutionId": "SO0062"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": "iam:PassRole",
         "Condition": {
          "StringEquals": {
           "iam:PassedToService": "ecs-tasks.amazonaws.com"
          }
         },
         "Effect": "Allow",
         "Resource": [
          {
           "Fn::GetAtt": [
            "DLTEcsDLTTaskExecutionRoleDE668717",
            "Arn"
           ]
          },
          {
           "Fn::GetAtt": [
            "DLTEcsDLTTaskRoleD37E29C5",
            "Arn"
           ]
          }
         ]
        },
        {
         "Action": "states:StartExecution",
         "Effect": "Allow",
         "Resource": {
          "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
         }
        },
        {
         "Action": "cloudwatch:DeleteDashboards",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":cloudwatch::",
            {
             "Ref": "AWS::AccountId"
            },
            ":dashboard/EcsLoadTesting*"
           ]
          ]
         }
        },
        {
         "Action": [
          "cloudformation:ListExports",
          "cloudformation:DescribeStacks"
         ],
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": [
          "ecs:ListAccountSettings",
          "ecs:ListTasks",
          "ecs:ListClusters",
          "ecs:DescribeTasks",
          "ecs:DescribeClusters",
          "ecs:DescribeTaskDefinition",
          "ecs:DescribeServices"
         ],
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": "servicequotas:GetServiceQuota",
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "DLTAPIServicesLambdaPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "ecs:ListTasks and cloudformation:ListExports do not support resource level permissions"
      },
      {
       "id": "F10",
       "reason": "requires in-line role permissions."
      }
     ]
    }
   }
  },
  "DLTApiLambdaApiEventsPolicy63BB60C8": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "events:PutTargets",
        "events:PutRule",
        "events:DeleteRule",
        "events:RemoveTargets"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":events:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":rule/*Scheduled"
          ]
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":events:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":rule/*Create"
          ]
         ]
        }
       ]
      },
      {
       "Action": "events:ListRules",
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":events:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":rule/*"
         ]
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTApiLambdaApiEventsPolicy63BB60C8",
    "Roles": [
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   }
  },
  "DLTApiSchedulerExecutionRole2AB7362D": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "scheduler.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    }
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTApiLambdaApiSchedulerPolicy392E0831": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "scheduler:CreateSchedule",
        "scheduler:DeleteSchedule",
        "scheduler:GetSchedule"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":scheduler:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":schedule/default/*Create"
          ]
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":scheduler:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":schedule/default/*Scheduled"
          ]
         ]
        }
       ]
      },
      {
       "Action": "iam:PassRole",
       "Condition": {
        "StringEquals": {
         "iam:PassedToService": "scheduler.amazonaws.com"
        }
       },
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTApiSchedulerExecutionRole2AB7362D",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTApiLambdaApiSchedulerPolicy392E0831",
    "Roles": [
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   }
  },
  "DLTApiDLTAPIServicesLambdaNewF30B7DE0": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/bb09c10ad46465e598c00497293e21756abeb558e7c3116567db54deb44d98dd.zip"
    },
    "Description": "API microservices for creating, updating, listing and deleting test scenarios",
    "Environment": {
     "Variables": {
      "HISTORY_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC"
      },
      "HISTORY_TABLE_GSI_NAME": "testId-startTime-index",
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "SCENARIOS_BUCKET": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      },
      "SOLUTION_ID": "SO0062",
      "STACK_ID": {
       "Ref": "AWS::StackId"
      },
      "STACK_NAME": {
       "Ref": "AWS::StackName"
      },
      "STATE_MACHINE_ARN": {
       "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
      },
      "TASK_CANCELER_ARN": {
       "Fn::GetAtt": [
        "DLTLambdaFunctionTaskCancelerNewA6986F4A",
        "Arn"
       ]
      },
      "SCHEDULER_ROLE_ARN": {
       "Fn::GetAtt": [
        "DLTApiSchedulerExecutionRole2AB7362D",
        "Arn"
       ]
      },
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "VERSION": "v4.1.0",
      "MIN_COMPATIBLE_VERSION": "4.1.0"
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTApiDLTAPIServicesLambdaRole4465EAA4",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 120
   },
   "DependsOn": [
    "DLTApiDLTAPIServicesLambdaRole4465EAA4"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "VPC not needed for lambda"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTApiDLTAPIServicesLambdaNewDLTApiInvokePermission9CFC1132": {
   "Type": "AWS::Lambda::Permission",
   "Properties": {
    "Action": "lambda:InvokeFunction",
    "FunctionName": {
     "Fn::GetAtt": [
      "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
      "Arn"
     ]
    },
    "Principal": "apigateway.amazonaws.com",
    "SourceArn": {
     "Fn::Join": [
      "",
      [
       "arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":execute-api:",
       {
        "Ref": "AWS::Region"
       },
       ":",
       {
        "Ref": "AWS::AccountId"
       },
       ":",
       {
        "Ref": "DLTApi0C903EB5"
       },
       "/*"
      ]
     ]
    }
   }
  },
  "DLTApiSchedulerInvokeLambdaPolicy5D66B0FC": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTApiSchedulerInvokeLambdaPolicy5D66B0FC",
    "Roles": [
     {
      "Ref": "DLTApiSchedulerExecutionRole2AB7362D"
     }
    ]
   }
  },
  "DLTApidltApiServicesLambdaLogGroup54338B12": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTApiDLTAPIServicesLambdaNewF30B7DE0"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W84",
       "reason": "KMS encryption unnecessary for log group"
      }
     ]
    }
   }
  },
  "DLTApiLambdaApiPermissionPolicyE12EEC7D": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "lambda:AddPermission",
        "lambda:RemovePermission"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTApiLambdaApiPermissionPolicyE12EEC7D",
    "Roles": [
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   }
  },
  "DLTApiAPILogsF7751EF3": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W84",
       "reason": "KMS encryption unnecessary for log group"
      }
     ]
    }
   }
  },
  "DLTApiAPILoggingRole119E64B1": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "apigateway.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "logs:CreateLogGroup",
          "logs:CreateLogStream",
          "logs:DescribeLogGroups",
          "logs:DescribeLogStreams",
          "logs:PutLogEvents",
          "logs:GetLogEvents",
          "logs:FilterLogEvent"
         ],
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":logs:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":*"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "apiLoggingPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "F10",
       "reason": "Requires inline policy resources."
      }
     ]
    }
   }
  },
  "DLTApi0C903EB5": {
   "Type": "AWS::ApiGateway::RestApi",
   "Properties": {
    "Description": "Distributed Load Testing API - version v4.1.0",
    "EndpointConfiguration": {
     "Types": [
      {
       "Fn::If": [
        "DLTApiIsGovCloudPartition6BAD7D2E",
        "REGIONAL",
        "EDGE"
       ]
      }
     ]
    },
    "Name": "DLTApi"
   }
  },
  "DLTApiCloudWatchRoleD45E4DD6": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "apigateway.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "ManagedPolicyArns": [
     {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs"
       ]
      ]
     }
    ]
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain"
  },
  "DLTApiAccount80CB63FF": {
   "Type": "AWS::ApiGateway::Account",
   "Properties": {
    "CloudWatchRoleArn": {
     "Fn::GetAtt": [
      "DLTApiCloudWatchRoleD45E4DD6",
      "Arn"
     ]
    }
   },
   "DependsOn": [
    "DLTApi0C903EB5"
   ],
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain"
  },
  "DLTApiDeployment098FF88848a44a4e9bf4d862b2f6429800d985af": {
   "Type": "AWS::ApiGateway::Deployment",
   "Properties": {
    "Description": "Distributed Load Testing API - version v4.1.0",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   },
   "DependsOn": [
    "DLTApiAPIAllRequestValidator02C9D47F",
    "DLTApiOPTIONS823B5F09",
    "DLTApiregionsANY2B8B3A61",
    "DLTApiregionsOPTIONSCB04B2B1",
    "DLTApiregionsC4EF9783",
    "DLTApiscenariostestIdANY993028D3",
    "DLTApiscenariostestIdbaselineDELETEF89F45B6",
    "DLTApiscenariostestIdbaselineGETEBD92F32",
    "DLTApiscenariostestIdbaselineOPTIONS18BF10ED",
    "DLTApiscenariostestIdbaselinePUT9B6A0CA8",
    "DLTApiscenariostestIdbaseline90D9E1E4",
    "DLTApiscenariostestIdOPTIONS0B339CE6",
    "DLTApiscenariostestId4C170989",
    "DLTApiscenariostestIdtestrunstestRunIdANYD6143F4D",
    "DLTApiscenariostestIdtestrunstestRunIdOPTIONSA0C3B203",
    "DLTApiscenariostestIdtestrunstestRunIdFE2B5E0B",
    "DLTApiscenariostestIdtestrunsANYA16D2CF8",
    "DLTApiscenariostestIdtestrunsOPTIONS12382689",
    "DLTApiscenariostestIdtestrunsA1B93897",
    "DLTApiscenariosANYDEF83622",
    "DLTApiscenariosOPTIONS6F514DA3",
    "DLTApiscenariosB6B76329",
    "DLTApistackinfoANY0BE2837B",
    "DLTApistackinfoOPTIONS883B8130",
    "DLTApistackinfo48B763A5",
    "DLTApitasksANY60403A44",
    "DLTApitasksOPTIONSDABED809",
    "DLTApitasks0A512C83",
    "DLTApivCPUDetailsANY4E680392",
    "DLTApivCPUDetailsOPTIONS8854EB1F",
    "DLTApivCPUDetailsABB0980D"
   ],
   "Metadata": {
    "aws:cdk:do-not-refactor": true,
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W68",
       "reason": "The solution does not require the usage plan."
      }
     ]
    }
   }
  },
  "DLTApiDeploymentStageprodC81F8DCB": {
   "Type": "AWS::ApiGateway::Stage",
   "Properties": {
    "AccessLogSetting": {
     "DestinationArn": {
      "Fn::GetAtt": [
       "DLTApiAPILogsF7751EF3",
       "Arn"
      ]
     },
     "Format": "{\"extendedRequestId\":\"$context.extendedRequestId\",\"ip\":\"$context.identity.sourceIp\",\"caller\":\"$context.identity.caller\",\"user\":\"$context.identity.user\",\"userAgent\":\"$context.identity.userAgent\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\"}"
    },
    "DeploymentId": {
     "Ref": "DLTApiDeployment098FF88848a44a4e9bf4d862b2f6429800d985af"
    },
    "MethodSettings": [
     {
      "DataTraceEnabled": false,
      "HttpMethod": "*",
      "LoggingLevel": "INFO",
      "ResourcePath": "/*"
     }
    ],
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    },
    "StageName": "prod",
    "TracingEnabled": true
   },
   "DependsOn": [
    "DLTApiAccount80CB63FF"
   ],
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "API_GW_CACHE_ENABLED_AND_ENCRYPTED"
     ]
    },
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W64",
       "reason": "The solution does not require the usage plan."
      }
     ]
    }
   }
  },
  "DLTApiOPTIONS823B5F09": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "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-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Fn::GetAtt": [
      "DLTApi0C903EB5",
      "RootResourceId"
     ]
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiregionsC4EF9783": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Fn::GetAtt": [
      "DLTApi0C903EB5",
      "RootResourceId"
     ]
    },
    "PathPart": "regions",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiregionsOPTIONSCB04B2B1": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "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-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApiregionsC4EF9783"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiregionsANY2B8B3A61": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiregionsC4EF9783"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariosB6B76329": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Fn::GetAtt": [
      "DLTApi0C903EB5",
      "RootResourceId"
     ]
    },
    "PathPart": "scenarios",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariosOPTIONS6F514DA3": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "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-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApiscenariosB6B76329"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariosANYDEF83622": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiscenariosB6B76329"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestId4C170989": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Ref": "DLTApiscenariosB6B76329"
    },
    "PathPart": "{testId}",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdOPTIONS0B339CE6": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "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-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApiscenariostestId4C170989"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdANY993028D3": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiscenariostestId4C170989"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunsA1B93897": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Ref": "DLTApiscenariostestId4C170989"
    },
    "PathPart": "testruns",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunsOPTIONS12382689": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "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-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdtestrunsA1B93897"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunsANYA16D2CF8": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdtestrunsA1B93897"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdFE2B5E0B": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Ref": "DLTApiscenariostestIdtestrunsA1B93897"
    },
    "PathPart": "{testRunId}",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdOPTIONSA0C3B203": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "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-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdtestrunstestRunIdFE2B5E0B"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdANYD6143F4D": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdtestrunstestRunIdFE2B5E0B"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdbaseline90D9E1E4": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Ref": "DLTApiscenariostestId4C170989"
    },
    "PathPart": "baseline",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdbaselineOPTIONS18BF10ED": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "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-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdbaseline90D9E1E4"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdbaselineGETEBD92F32": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "GET",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdbaseline90D9E1E4"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdbaselinePUT9B6A0CA8": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "PUT",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdbaseline90D9E1E4"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdbaselineDELETEF89F45B6": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "DELETE",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdbaseline90D9E1E4"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApitasks0A512C83": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Fn::GetAtt": [
      "DLTApi0C903EB5",
      "RootResourceId"
     ]
    },
    "PathPart": "tasks",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApitasksOPTIONSDABED809": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "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-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApitasks0A512C83"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApitasksANY60403A44": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApitasks0A512C83"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApivCPUDetailsABB0980D": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Fn::GetAtt": [
      "DLTApi0C903EB5",
      "RootResourceId"
     ]
    },
    "PathPart": "vCPUDetails",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApivCPUDetailsOPTIONS8854EB1F": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "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-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApivCPUDetailsABB0980D"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApivCPUDetailsANY4E680392": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApivCPUDetailsABB0980D"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApistackinfo48B763A5": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Fn::GetAtt": [
      "DLTApi0C903EB5",
      "RootResourceId"
     ]
    },
    "PathPart": "stack-info",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApistackinfoOPTIONS883B8130": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "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-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApistackinfo48B763A5"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApistackinfoANY0BE2837B": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApistackinfo48B763A5"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiApiAccountConfigBF306CC3": {
   "Type": "AWS::ApiGateway::Account",
   "Properties": {
    "CloudWatchRoleArn": {
     "Fn::GetAtt": [
      "DLTApiAPILoggingRole119E64B1",
      "Arn"
     ]
    }
   },
   "DependsOn": [
    "DLTApi0C903EB5"
   ]
  },
  "DLTApiAPIAllRequestValidator02C9D47F": {
   "Type": "AWS::ApiGateway::RequestValidator",
   "Properties": {
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    },
    "ValidateRequestBody": true,
    "ValidateRequestParameters": true
   }
  },
  "DLTCognitoAuthIoTPolicyB8FDFE53": {
   "Type": "AWS::IoT::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "iot:Connect",
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":iot:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":client/*"
         ]
        ]
       }
      },
      {
       "Action": "iot:Subscribe",
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":iot:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":topicfilter/dlt/*"
         ]
        ]
       }
      },
      {
       "Action": "iot:Receive",
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":iot:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":topic/dlt/*"
         ]
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    }
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "Cannot specify the resource to attach policy to identity"
      }
     ]
    }
   }
  },
  "DLTCognitoAuthDLTUserPoolFA41A712": {
   "Type": "AWS::Cognito::UserPool",
   "Properties": {
    "AccountRecoverySetting": {
     "RecoveryMechanisms": [
      {
       "Name": "verified_phone_number",
       "Priority": 1
      },
      {
       "Name": "verified_email",
       "Priority": 2
      }
     ]
    },
    "AdminCreateUserConfig": {
     "AllowAdminCreateUserOnly": true,
     "InviteMessageTemplate": {
      "EmailMessage": {
       "Fn::Join": [
        "",
        [
         "\n                <p>\n                   Please use the credentials below to login to the Distributed Load Testing console.\n                </p>\n                <p>\n                    Username: <strong>{username}</strong>\n                </p>\n                <p>\n                    Password: <strong>{####}</strong>\n                </p>\n                <p>\n                    Console: <strong>https://",
         {
          "Ref": "ConsoleDomainName"
         },
         "/</strong>\n                </p>\n              "
        ]
       ]
      },
      "EmailSubject": "Welcome to Distributed Load Testing",
      "SMSMessage": "Your username is {username} and temporary password is {####}."
     }
    },
    "AliasAttributes": [
     "email"
    ],
    "AutoVerifiedAttributes": [
     "email"
    ],
    "EmailVerificationMessage": "The verification code to your new account is {####}",
    "EmailVerificationSubject": "Verify your new account",
    "Policies": {
     "PasswordPolicy": {
      "MinimumLength": 12,
      "RequireLowercase": true,
      "RequireNumbers": true,
      "RequireSymbols": true,
      "RequireUppercase": true
     }
    },
    "Schema": [
     {
      "Mutable": true,
      "Name": "email",
      "Required": true
     }
    ],
    "SmsVerificationMessage": "The verification code to your new account is {####}",
    "UserPoolAddOns": {
     "AdvancedSecurityMode": "ENFORCED"
    },
    "UserPoolName": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-user-pool"
      ]
     ]
    },
    "VerificationMessageTemplate": {
     "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 {####}"
    }
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCognitoAuthCognitoUserPoolLogGroupB2425FFC": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTCognitoAuthCognitoLogDeliveryConfiguration3B17611D": {
   "Type": "AWS::Cognito::LogDeliveryConfiguration",
   "Properties": {
    "LogConfigurations": [
     {
      "CloudWatchLogsConfiguration": {
       "LogGroupArn": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":logs:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":log-group:",
          {
           "Ref": "DLTCognitoAuthCognitoUserPoolLogGroupB2425FFC"
          }
         ]
        ]
       }
      },
      "EventSource": "userAuthEvents",
      "LogLevel": "INFO"
     },
     {
      "CloudWatchLogsConfiguration": {
       "LogGroupArn": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":logs:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":log-group:",
          {
           "Ref": "DLTCognitoAuthCognitoUserPoolLogGroupB2425FFC"
          }
         ]
        ]
       }
      },
      "EventSource": "userNotification",
      "LogLevel": "ERROR"
     }
    ],
    "UserPoolId": {
     "Ref": "DLTCognitoAuthDLTUserPoolFA41A712"
    }
   }
  },
  "MCPServerDLTUserPoolDomainA26D16C0": {
   "Type": "AWS::Cognito::UserPoolDomain",
   "Properties": {
    "Domain": {
     "Fn::Join": [
      "",
      [
       "dlt-",
       {
        "Fn::GetAtt": [
         "DLTCustomResourcesCustomResourceUuidD1C03F15",
         "UUID"
        ]
       }
      ]
     ]
    },
    "UserPoolId": {
     "Ref": "DLTCognitoAuthDLTUserPoolFA41A712"
    }
   }
  },
  "DLTCognitoAuthDLTUserPoolClientA2F8B2DB": {
   "Type": "AWS::Cognito::UserPoolClient",
   "Properties": {
    "AllowedOAuthFlows": [
     "code"
    ],
    "AllowedOAuthFlowsUserPoolClient": true,
    "AllowedOAuthScopes": [
     "openid",
     "email",
     "profile"
    ],
    "CallbackURLs": [
     {
      "Fn::Join": [
       "",
       [
        "https://",
        {
         "Ref": "ConsoleDomainName"
        }
       ]
      ]
     },
     {
      "Fn::Join": [
       "",
       [
        "https://",
        {
         "Ref": "ConsoleDomainName"
        },
        "/"
       ]
      ]
     },
     "http://localhost:3000",
     "http://localhost:3000/",
     "http://localhost:7521/callback",
     "http://localhost:3000/callback"
    ],
    "ClientName": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-userpool-client"
      ]
     ]
    },
    "EnableTokenRevocation": true,
    "ExplicitAuthFlows": [
     "ALLOW_USER_SRP_AUTH"
    ],
    "GenerateSecret": false,
    "LogoutURLs": [
     {
      "Fn::Join": [
       "",
       [
        "https://",
        {
         "Ref": "ConsoleDomainName"
        }
       ]
      ]
     },
     {
      "Fn::Join": [
       "",
       [
        "https://",
        {
         "Ref": "ConsoleDomainName"
        },
        "/"
       ]
      ]
     },
     "http://localhost:3000",
     "http://localhost:3000/",
     "http://localhost:7521/callback",
     "http://localhost:3000/callback"
    ],
    "RefreshTokenRotation": {
     "Feature": "ENABLED",
     "RetryGracePeriodSeconds": 60
    },
    "RefreshTokenValidity": 1440,
    "SupportedIdentityProviders": [
     "COGNITO"
    ],
    "TokenValidityUnits": {
     "RefreshToken": "minutes"
    },
    "UserPoolId": {
     "Ref": "DLTCognitoAuthDLTUserPoolFA41A712"
    },
    "WriteAttributes": [
     "address",
     "email",
     "phone_number"
    ]
   }
  },
  "DLTCognitoAuthCognitoHostedUiLambdaServiceRole397F7BE5": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "ManagedPolicyArns": [
     {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
       ]
      ]
     }
    ]
   }
  },
  "DLTCognitoAuthCognitoHostedUiLambdaServiceRoleDefaultPolicy65EE264C": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "cognito-idp:SetUICustomization",
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTCognitoAuthDLTUserPoolFA41A712",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTCognitoAuthCognitoHostedUiLambdaServiceRoleDefaultPolicy65EE264C",
    "Roles": [
     {
      "Ref": "DLTCognitoAuthCognitoHostedUiLambdaServiceRole397F7BE5"
     }
    ]
   }
  },
  "DLTCognitoAuthCognitoHostedUiLambda98AEA750": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/874f015853d8cacd9be9a6d5287fd8b7fbaa4162c59e9240f1d75fdde1ac6436.zip"
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTCognitoAuthCognitoHostedUiLambdaServiceRole397F7BE5",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 300
   },
   "DependsOn": [
    "DLTCognitoAuthCognitoHostedUiLambdaServiceRoleDefaultPolicy65EE264C",
    "DLTCognitoAuthCognitoHostedUiLambdaServiceRole397F7BE5"
   ],
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "LAMBDA_INSIDE_VPC",
      "LAMBDA_CONCURRENCY_CHECK"
     ]
    }
   }
  },
  "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventServiceRole701715C4": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "ManagedPolicyArns": [
     {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
       ]
      ]
     }
    ]
   }
  },
  "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventServiceRoleDefaultPolicy9768F7DA": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTCognitoAuthCognitoHostedUiLambda98AEA750",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTCognitoAuthCognitoHostedUiLambda98AEA750",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:GetFunction",
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTCognitoAuthCognitoHostedUiLambda98AEA750",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventServiceRoleDefaultPolicy9768F7DA",
    "Roles": [
     {
      "Ref": "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventServiceRole701715C4"
     }
    ]
   }
  },
  "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventEBA8BB49": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/07a90cc3efdfc34da22208dcd9d211f06f5b0e01b21e778edc7c3966b1f61d57.zip"
    },
    "Description": "AWS CDK resource provider framework - onEvent (distributed-load-testing-on-aws-alb-ecs/DLTCognitoAuth/CognitoHostedUiProvider)",
    "Environment": {
     "Variables": {
      "USER_ON_EVENT_FUNCTION_ARN": {
       "Fn::GetAtt": [
        "DLTCognitoAuthCognitoHostedUiLambda98AEA750",
        "Arn"
       ]
      }
     }
    },
    "Handler": "framework.onEvent",
    "LoggingConfig": {
     "ApplicationLogLevel": "FATAL",
     "LogFormat": "JSON"
    },
    "Role": {
     "Fn::GetAtt": [
      "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventServiceRole701715C4",
      "Arn"
     ]
    },
    "Runtime": "nodejs22.x",
    "Timeout": 900
   },
   "DependsOn": [
    "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventServiceRoleDefaultPolicy9768F7DA",
    "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventServiceRole701715C4"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W89",
       "reason": "Lambda function for Cognito UI customization does not need to be in a VPC"
      },
      {
       "id": "W92",
       "reason": "Lambda function for Cognito UI customization does not need reserved concurrency"
      }
     ]
    }
   }
  },
  "DLTCognitoAuthCognitoUICustomization6480C5AD": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventEBA8BB49",
      "Arn"
     ]
    },
    "UserPoolId": {
     "Ref": "DLTCognitoAuthDLTUserPoolFA41A712"
    },
    "CSS": ".banner-customizable { background-color: #232f3e; padding: 25px 0px; } .logo-customizable { max-width: 350px; max-height: 80px; } .submitButton-customizable { background-color: #ec7211; } .submitButton-customizable:hover { background-color: #eb5f07; }",
    "ImageFileBase64": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAA8CAYAAABIFuztAAAABmJLR0QA/wD/AP+gvaeTAAASyUlEQVR4nO2deZwV1ZXHf4edFoNAEBQQxSURxQR0MC7j4KiEfFxiHBNHE+KCyugnjtHoiNExJtFojKJRx7jE+HFJjOA6TqIDGAWFAJooYUCCoGwCyqbQ7E3/5o9zizp1u97r97r7ddPJ+X4+/aHq3nNv3aq67y5nKQDHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHaWKkuS9Isi+Az+dk1QDYAOAjEVlWpPwBAPYNpwtF5IMmb2QJkPwsgC+G0zUi8nZI3xPAYSF9tYi80xLta2pI9gTwhXC6836LyLcF0N8kLRaRHZVqX1NC8lAAvcPpXBFZXqJsKWwRkTca077GQvKfALQPp1NEZFtLtmdXhmQVgKNN0iwRWRXJ9AdwYDhdLyIzo3wBcIJJqhaR6ZFMWwDHm6RpIrLJ5HcLdewDYHcA1QD+D8BkEdnSkHtrlZC8hPWziOQVJNvklL/VyF3fBO3pR/KJBpQ7xbTjZZP+NZP+YmPbV2JbDib5iwpf4zRzX78vQX7P6J2WM8i2KCQfN+0+vwzZUmi2BQ/JA0g+nJO+xrSnV3O1pzVC8sLo/d2ZI/NVk7+aOmHY/MOiOjaR7BjJfMHkb07ySbYn+TOS2wr0pzUkL67sUyhMnQF6F6E/gLEAniPZrhIXINmG5A0A5gE4qxLXqDQkq0jeBWAWgJNauj3OrgHJDiRvha5QT2np9rRyLozOv02yU5T2BgCG4x5IdyMJJ0bnnQEMjdK+ZI5nisjWcHwfgKuQ7hhjugN4gOS/FcivKBUZnMtgIYDbAHQC0BXAZwAMR6oCOg3A9QBuNGUmm+Npjbh2FYAfhuOaBpRfAOCn4Xh+I9rRGPYDcHkLXdtRfgXg9SjtXqQ/+FsALDJ5G5qhTb0BXFMk/+fQ/g8AGyvfnNYJVT15ZJTcHcCZAHZqLURkDcm5AA4JSV9CdkyIJxAAGIZsv7ETyORw/c8DGBXSaqB96UUA6wEcBOAnAA4N+beQfFRENpdyb60WZlVYdXTBYWfwCyOzgWT3Mq/RkWR/kr2pusU8mS7mGttLqLMTyX1JdqhHLleFRbIvVV3WZLs+koeYay2oR/azJAeQ/EyJdXcP8slWukVUWCS7hnZ0K1G+Lcm9Q5l6+w1JMe9GQlrJKqwCdW425eOVZiy7W2hrSaok0w97MVKVGJl9zPU/Krf9UV0dw/V6liDbgeR+VPtgk2D6YdcGlO0d2t6ghTLJO81zXGSOp+TI2jHrPpPegWR1SLdqqFei8u+avJNC2nkm7emca+5PstbIDGvIfbYqWM8EEmSqmNXTnm/yfkBybfj7Xk7d86OHup3kcyQPM3KjSa5jlqTO3YLMqnA+heQ/m/Z8QnIoyS+bMk+bujMTCNVW8p5JW0Hyu6yrJ51s6vtilPcdk/eTkHYTyU9NvTtC/oKo7CkkZ0Vy06iG1LxnP4Tk6+YZbqT+kL5u6qjoBEKdBK6gvkvLLJLfKlDmcySfpr5vywckr2a+PW00yWVGdhHJb7AZJhCq3ep3UXsXhjbFfaMNyatIvh/d21aSvyV5oJEdQ+2jCbXUfrHSyCxk2p96mvTpIe1D6sT2c+oCLmFm3v1Qf693Mx0oSe3PA6m/geRapS4COpD8PrODdi3JN0l+LUf+AnONkSRPJjnXlF1L8gaWsXijTpyrTR3HhOedMDCSP8fk/dmkH2fSnwxtIY0dhDpJJr+3bUzHoG+bsstpxjBT/zeov82v8O/BnsUSJpAg96yRe9Ck5xrRSf4Hi7OW4YdG8vIicl2CTE04X8ZsR9pIcneWZkT/mDpg53F7dL9vm7wjoryrTN6dIe2OAvWuNuUuYnYytWwneWZ0nSHMDgKWFea4YhMI9Yc7qUAbEu6nGWSpO4jl9ZS5KrrOfxaQqyW50pw3+QRCcjCzg3zM3ZH8rUVkGe597yB7YwGZraa+XCM600F3C8nXCtSzjtlJp10R2VUkF5jzUnaEXagTWTFuicrYMWUiC/f5K8t4h2eZcjNC2nMm7a5Ivp/J2850EviRST+P5DPm/LggM8KkTTd19mV20tpBnZjHUPtQs3vRxuyqRnQAsN4qfYsJhgc5Jpx+CGAI1K7SB6mushuAS8LxWwCsN0Ut1J7xUwCxS2OfUHYcgMcAPCUipeqxe0LtPF+F6jgfNHlXMtpplMkfAFgPm0+g7b8bAEjuB+AeqKv2dqhOfAiAfwewGWr/eojZVeH9AHYLx38FcCqAowA8gvJcVRvDj5G6PG4BcBOAc6B2hdqQPhqANRpeAWCvcPwU9D4Ph95Pwk5HCaor+A9M3q+hrponA5gLoGIrOeoq+NdQmx+gfWoogNOR2kouI3lCkK9CaueaD9V5d4S6sr8Q0vcCcEE4ngrAeuRtgvaLzIKlHjoCOAbA96Gu2+dC3wUA7IGsYf4iAMludguAK6HP/hIAHQDsX8Z1AeAupHaHDQBugL7/XyE1VI8hWcjx5USoDeH4UI9dpI4sox2jzPHj4d/HbF0kOycnIrIU6ftrByBZBFr7x6TwlzAs/GvtHzvVYyGcwfbTNgCOg9pC/gxgJcl7SR5U/+38jcDSdyB25p5q0uvsQEh2NmmrSZ6RvFyqDn04o+0d67GBMN2BkNFqI+SXsgOpIfm5qNyrJv9nJr2sHUhIL2gDoaq4EuIVrX22o0PaQfZ5UAdZW2aaya/IDoT6rjaaMidH+Xbn+CGDSoKq8z+d5PUMK7+Q3s3ILzPp15n02B9/X2bVSk26A6GqQxNm0ahVSB5v8p4KaX3sPVDVMx1CXk+SJ5DsEV2jqA2E9e9ASPXismUeM3nXmfRpeekh71xmKboDodqukmdfS/LoKP+Hpq45Jt2OKauok26S9w/FnkWBduzLVHOwjcGmQ1WtrTL1jYzKWdXnNdT+nNzPu0HmQCPzh5D2skmr4zVHVVMtZmG2sAH9tCnYlXcg1lWuaKBM8DxIOlQPAM8AWEvyVehKdZmINMaY+EwDy80Skb9GaePN8eAG1lsKx5jj5SQPT/4ArDR5R+W05U8iEhvlx6PyHI/UO2iOiPwuyr8PqdfQ3gAGAYCILBGR50XkJgCdqZP43TCrOaQ7KyB7r+PsBURkEYA3G3UXxTnWHC8AMNi8l81Id1nJqnQlgGTy6wPgfwCsIzkBuqJeLCJrKtDOV6Pz982xnQiGmONnozLjkO4aSmEEUs/QN0Qk9rK83dQ3kGS/nDpm2gA8qAYgoSQbDHQ3l4yNL4nIagAIAZdPGrk4/iL2qhqG9H5eCXW8B2BJSDuKutBNdly1yO6YEMqMg3pcHgfdoc2LRDoCeJDkkLhspdmVJ5A9zfGqglIpowDYH1In6Au8FcAcki9RI0YbwqIGlluRk2aj7At16NhzrCFeJHbHdQtUbZf8/ZfJS36Eti15kdcFvw7QhFhV5XtxpohsR/Zd9AVUhUlyFMm3oX3lWQCXIXVxBNKBGaj/Xj8sr9llYfv1Gci+lz8i/U32Iykhev98ZN1/q6BxP3cAeI/qPNDUare10bldxCXeap2hg1eCXZgkC7u4nmLU9/43RNfIU20Xa3e94x3Va/M8kzSQaleZSHIiUrUTABzLrDE9nkBi9VV83Clca49w/hcR+SSvXSJSKyKvi8gVInIwNCL9aqQLqnaoO6FVnJaOAymG3fq/VZ+wiMyg6v1HAvg6dGVtO/cI6Ioo9usuhYb6yue5HlaZ40I+27GrbRy4VAo2tmUygI8LyCX+6vaH1iVHrionralZX08bAP2MQ0Ly/G5AGiu0GcD/Avg9dECeHdLtZ1S2muPmvlfbjnehwX6FaA9gm4hMIrkPdGV8BvS3YQPL/gW6w/pKE7Zza3RemyOzBWpjSZ5XDwDrkkyS7ZEOjqXQ0PdvKaXdxRiOdFEFAAeEv0JcDOC74XgedAHTE2oz/NeQXgPgNVNmElKblXXuyLgHk3wcuvPYC8A37edPgs3ldqo68+aQfHCRdlaEXXICITkc6cOoRWosrI82AF4QkfvC6ugYqPE0iSYdSrJXUGfZjtU2rPYKbbfjTlkqg0hWRVtquyq2agE74McTyN4F6rf3EL/LDxBUPAAeEZFHkwyqnWCriNRE8jvbSLJt9O2qSqrbEqzabDDJLiJSnSSEBUKy6qwFMDsMUsmPcAeAQSKyMMhbu4t9VvZeY5fpdkifWyWw73ymiJxnrt0eQLsCwWBtAPxGRMZSPQX/EbpYOjvkn0iycyhbrF80GSJCkosAJKvwYci+w5NQdzddDFv2SJId7He6SA5GOrFsQX4Abzkqszxs5Pkm5P/22yGdyEaSvFZENofn8QaAxNU4iYd5K9pZvBLaKQAGmPQ4vmR/pCrmCwFMR13sIrXZgwhbWoXViRokNIDkIKoR8Vpk9e3jgt6wIKHcCqgn0gSSHcMLnQS1gawz4sk92x+aoO6gbWnoRwC7QlfHSTv3g3oQJUw0x3brbWNW+kI9dPKwE9PuzPq5v2yOL2P28wuPAqimGu4TV96Z0OcH6IrnO6YNhyLrldIQ+pt3XecvyEwHsDgc9wBwD1ODcVcADyCrm14FHVCSQaUG2Z3WCHNsV7QTzPG3qBG/CVciuwJtaux7OZOk9VK6CPpeFpC8GQCozgEfQ9Wzz4WJvVpEXoKuYhMHEEH6cVTbL6rCxFQpXjLHPyZ5LDVu5WiozaocJiL9HfQHcFtQKYHqOmxVr+OjhVmjoX4I9VSTdJKIdI//oB5wycSSRKYnxF8lAIL9I0FEPgbwl/jyOWWfMsejqE4Ee4S2diZ5IbJfoqgT4Pg3B0v7mGLC+4w8N5jvhdWB2SCrP1E9ba6jBgImvBbVZb1RFlBjHXqHPOuFVUeFxNK9sEjyLZLPMxu8ON/WSw2QtOWeJPkg1avMRrBaL6yuzMaZzKXGBAg1uOsDkzeP5FhqYFfCema9cK5nlilBvjp6Hg3xwiqKKXc6s378K0I77LP7hMZ1kVkPlSkkL6XGisQfoEsmo7bMer1VU+OO/hjO7b1WIg7kSZO/lhrF/EuqN03CqUF2d5IfmfSpJK+lxrHMNOnPmvrbMxs/MI8ak5QErpXihXVY1GYbZzXWpPcKdVuS576RWY+2UuJAzo/qWkZ9p+tN2krqwiopY8eUh6L6Opm8op8sYtbbcQGLxFlQAzgTXjfpR7Auw3LK3x7JzM2R6URyTk59eTFEy1jmFztaJSxtAqkhOY45hkEWDiTcn3UjdS1zGHltkHwoR+6IkNcUE8hY6mQWs5zkoKi+bswGXVnZy8z5nVG5CTlleoa8gcxG81rWM4pGpwaF/SZHdhPJi815xSaQUPZcZgcMyxLWdY09jXUj0EmNXJ5qzo8zZQZQI7Jj5pK82ZxXYgLpwsLBkjtIXh3JD2LxQMk3GX1qhNmAtYQBIa/JJpCQN5Tk0uhaa6lfa7DvsaTPkVD7+6YC9zqfuiO28k01gdjPidxYj+zwqF2HhPR20T1XM/rybpAbEZV/oMB1+pGcUeBZJMyNn0lz0RI2kLeRfoTQshXqabIU+i38pQXK535MUUQWhod4FjSIZx+oEX0p1CVxvPnCZcLlUH34sVA11btIPXBuQ6ouyet4hT6mON+kT4AGOF4A4MtQw+cMAPeKiFWrQUTWUSevS6F6z8Sl72GoKqxPEJ2KLGcD+B40eGsLgHfCvxCRuVQvkW9Cg716QY187wB4OHb/DDaRc0iOhzoidIMG1t0P9ShLVE2xa3IeSQBb2YjIo9RJ6myowbgXgI+g7/6J2EYgIv9N1Y+PhuqNq6FG9CegdrDEuNzJlHmfGsh5CdSeUAsNznwIahdJdPeJEb4c7kD626rjiSci1dTvHZ0CVZn0hfb/+VB71bxIfjY1nuic0LZ+of4lULXP88FDzXIB1EB/JDQ4djZSFWWhjyn+EqmXWOx0MQPp+8y4morIzNC+k6FG31VQW+RaZr8dV5IziojcQ/KZcL+HQ20Jy6GqoN/m/P8ldkyJXbBrTF5Bgzo1luYFpPbWR+pp5iRokGuiHuwZ2l5Dcgx0/AGAJTnjDqDqKvv7eD7vIiKylORR0PFjBPQjirsB+BQ6tk0C8GLO+28WWjwU3nGc1gvJa6BeSosBzBaRF0zentCJHwBWiEghZxCnlbJLemE5jtNq2AOp59J2kpdCdwS9kDXwTo4LOo7jOH/HUD/4FxvRYzYw+nqt4ziO4yQOCY9TDf3Wg+5TapT8IfXX4rRG3AbiOE6TQY056QV15FgrIuVGgjuO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziOUyr/D8QA7LGXVkTnAAAAAElFTkSuQmCC"
   },
   "DependsOn": [
    "MCPServerDLTUserPoolDomainA26D16C0",
    "DLTCognitoAuthDLTUserPoolClientA2F8B2DB"
   ],
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCognitoAuthDLTIdentityPoolE110578F": {
   "Type": "AWS::Cognito::IdentityPool",
   "Properties": {
    "AllowUnauthenticatedIdentities": false,
    "CognitoIdentityProviders": [
     {
      "ClientId": {
       "Ref": "DLTCognitoAuthDLTUserPoolClientA2F8B2DB"
      },
      "ProviderName": {
       "Fn::GetAtt": [
        "DLTCognitoAuthDLTUserPoolFA41A712",
        "ProviderName"
       ]
      }
     }
    ]
   }
  },
  "DLTCognitoAuthDLTCognitoAuthorizedRole9977D4DC": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Fn::If": [
        "DLTCognitoAuthIsGovCloudPartition9F5A131A",
        {
         "Fn::If": [
          "DLTCognitoAuthIsGovCloudEastRegion022D5DDD",
          {
           "Effect": "Allow",
           "Principal": {
            "Federated": "cognito-identity.us-gov-east-1.amazonaws.com"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
            "StringEquals": {
             "cognito-identity.us-gov-east-1.amazonaws.com:aud": {
              "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
             }
            },
            "ForAnyValue:StringLike": {
             "cognito-identity.us-gov-east-1.amazonaws.com:amr": "authenticated"
            }
           }
          },
          {
           "Effect": "Allow",
           "Principal": {
            "Federated": "cognito-identity-us-gov.amazonaws.com"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
            "StringEquals": {
             "cognito-identity-us-gov.amazonaws.com:aud": {
              "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
             }
            },
            "ForAnyValue:StringLike": {
             "cognito-identity-us-gov.amazonaws.com:amr": "authenticated"
            }
           }
          }
         ]
        },
        {
         "Effect": "Allow",
         "Principal": {
          "Federated": "cognito-identity.amazonaws.com"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
          "StringEquals": {
           "cognito-identity.amazonaws.com:aud": {
            "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
           }
          },
          "ForAnyValue:StringLike": {
           "cognito-identity.amazonaws.com:amr": "authenticated"
          }
         }
        }
       ]
      }
     ],
     "Version": "2012-10-17"
    },
    "Description": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       " Identity Pool authenticated role"
      ]
     ]
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "execute-api:Invoke",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":execute-api:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":",
            {
             "Ref": "DLTApi0C903EB5"
            },
            "/prod/*"
           ]
          ]
         }
        },
        {
         "Action": [
          "s3:PutObject",
          "s3:GetObject"
         ],
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            {
             "Fn::GetAtt": [
              "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
              "Arn"
             ]
            },
            "/public/*"
           ]
          ]
         }
        },
        {
         "Action": "s3:GetObject",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            {
             "Fn::GetAtt": [
              "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
              "Arn"
             ]
            },
            "/results/*"
           ]
          ]
         }
        },
        {
         "Action": "s3:GetObject",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            {
             "Fn::GetAtt": [
              "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
              "Arn"
             ]
            },
            "/regional-template/*"
           ]
          ]
         }
        },
        {
         "Action": "s3:ListBucket",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "InvokeApiPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "iot:AttachPolicy",
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": "iot:Connect",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":iot:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":client/*"
           ]
          ]
         }
        },
        {
         "Action": "iot:Subscribe",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":iot:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":topicfilter/dlt/*"
           ]
          ]
         }
        },
        {
         "Action": "iot:Receive",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":iot:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":topic/dlt/*"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "IoTPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "iot:AttachPolicy does not allow for resource specification"
      },
      {
       "id": "F10",
       "reason": "requires inline policies"
      }
     ]
    }
   }
  },
  "DLTCognitoAuthDLTCognitoUnauthorizedRole6FC43D42": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Fn::If": [
        "DLTCognitoAuthIsGovCloudPartition9F5A131A",
        {
         "Fn::If": [
          "DLTCognitoAuthIsGovCloudEastRegion022D5DDD",
          {
           "Effect": "Allow",
           "Principal": {
            "Federated": "cognito-identity.us-gov-east-1.amazonaws.com"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
            "StringEquals": {
             "cognito-identity.us-gov-east-1.amazonaws.com:aud": {
              "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
             }
            },
            "ForAnyValue:StringLike": {
             "cognito-identity.us-gov-east-1.amazonaws.com:amr": "unauthenticated"
            }
           }
          },
          {
           "Effect": "Allow",
           "Principal": {
            "Federated": "cognito-identity-us-gov.amazonaws.com"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
            "StringEquals": {
             "cognito-identity-us-gov.amazonaws.com:aud": {
              "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
             }
            },
            "ForAnyValue:StringLike": {
             "cognito-identity-us-gov.amazonaws.com:amr": "unauthenticated"
            }
           }
          }
         ]
        },
        {
         "Effect": "Allow",
         "Principal": {
          "Federated": "cognito-identity.amazonaws.com"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
          "StringEquals": {
           "cognito-identity.amazonaws.com:aud": {
            "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
           }
          },
          "ForAnyValue:StringLike": {
           "cognito-identity.amazonaws.com:amr": "unauthenticated"
          }
         }
        }
       ]
      }
     ],
     "Version": "2012-10-17"
    }
   }
  },
  "DLTCognitoAuthCognitoAttachRole8337C7A4": {
   "Type": "AWS::Cognito::IdentityPoolRoleAttachment",
   "Properties": {
    "IdentityPoolId": {
     "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
    },
    "Roles": {
     "unauthenticated": {
      "Fn::GetAtt": [
       "DLTCognitoAuthDLTCognitoUnauthorizedRole6FC43D42",
       "Arn"
      ]
     },
     "authenticated": {
      "Fn::GetAtt": [
       "DLTCognitoAuthDLTCognitoAuthorizedRole9977D4DC",
       "Arn"
      ]
     }
    }
   }
  },
  "DLTCognitoAuthCognitoUser8FAEDC59": {
   "Type": "AWS::Cognito::UserPoolUser",
   "Properties": {
    "DesiredDeliveryMediums": [
     "EMAIL"
    ],
    "ForceAliasCreation": true,
    "UserAttributes": [
     {
      "Name": "email",
      "Value": {
       "Ref": "AdminEmail"
      }
     },
     {
      "Name": "nickname",
      "Value": {
       "Ref": "AdminName"
      }
     },
     {
      "Name": "email_verified",
      "Value": "true"
     }
    ],
    "UserPoolId": {
     "Ref": "DLTCognitoAuthDLTUserPoolFA41A712"
    },
    "Username": {
     "Ref": "AdminName"
    }
   }
  },
  "WebConsoleAssetsHandlerServiceRole90869694": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "ManagedPolicyArns": [
     {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
       ]
      ]
     }
    ]
   }
  },
  "WebConsoleAssetsHandlerServiceRoleDefaultPolicyBFD9C256": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "s3:DeleteObject*",
        "s3:PutObject",
        "s3:PutObjectLegalHold",
        "s3:PutObjectRetention",
        "s3:PutObjectTagging",
        "s3:PutObjectVersionTagging",
        "s3:Abort*"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTConsoleResourcesConsoleBucket8C91CC58",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTConsoleResourcesConsoleBucket8C91CC58",
             "Arn"
            ]
           },
           "/*"
          ]
         ]
        }
       ]
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "WebConsoleAssetsHandlerServiceRoleDefaultPolicyBFD9C256",
    "Roles": [
     {
      "Ref": "WebConsoleAssetsHandlerServiceRole90869694"
     }
    ]
   }
  },
  "WebConsoleAssetsHandler1472E7D6": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/66e99d305ef4ba34e272c77584ea1bf22906a0250cc5f5dc92481aaf101fe74b.zip"
    },
    "Handler": "index.handler",
    "MemorySize": 512,
    "Role": {
     "Fn::GetAtt": [
      "WebConsoleAssetsHandlerServiceRole90869694",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 300
   },
   "DependsOn": [
    "WebConsoleAssetsHandlerServiceRoleDefaultPolicyBFD9C256",
    "WebConsoleAssetsHandlerServiceRole90869694"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W89",
       "reason": "Lambda does not need VPC - only writes to S3"
      },
      {
       "id": "W92",
       "reason": "Temporary custom resource - no reserved concurrency needed"
      }
     ]
    }
   }
  },
  "WebConsoleAssetsProviderframeworkonEventServiceRole3DF0B98A": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "ManagedPolicyArns": [
     {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
       ]
      ]
     }
    ]
   }
  },
  "WebConsoleAssetsProviderframeworkonEventServiceRoleDefaultPolicy819CE4DA": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "WebConsoleAssetsHandler1472E7D6",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "WebConsoleAssetsHandler1472E7D6",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:GetFunction",
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "WebConsoleAssetsHandler1472E7D6",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "WebConsoleAssetsProviderframeworkonEventServiceRoleDefaultPolicy819CE4DA",
    "Roles": [
     {
      "Ref": "WebConsoleAssetsProviderframeworkonEventServiceRole3DF0B98A"
     }
    ]
   }
  },
  "WebConsoleAssetsProviderframeworkonEvent35FDF5FD": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/07a90cc3efdfc34da22208dcd9d211f06f5b0e01b21e778edc7c3966b1f61d57.zip"
    },
    "Description": "AWS CDK resource provider framework - onEvent (distributed-load-testing-on-aws-alb-ecs/WebConsoleAssets/Provider)",
    "Environment": {
     "Variables": {
      "USER_ON_EVENT_FUNCTION_ARN": {
       "Fn::GetAtt": [
        "WebConsoleAssetsHandler1472E7D6",
        "Arn"
       ]
      }
     }
    },
    "Handler": "framework.onEvent",
    "LoggingConfig": {
     "ApplicationLogLevel": "FATAL",
     "LogFormat": "JSON"
    },
    "Role": {
     "Fn::GetAtt": [
      "WebConsoleAssetsProviderframeworkonEventServiceRole3DF0B98A",
      "Arn"
     ]
    },
    "Runtime": "nodejs22.x",
    "Timeout": 900
   },
   "DependsOn": [
    "WebConsoleAssetsProviderframeworkonEventServiceRoleDefaultPolicy819CE4DA",
    "WebConsoleAssetsProviderframeworkonEventServiceRole3DF0B98A"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W89",
       "reason": "Lambda does not need VPC - only writes to S3"
      },
      {
       "id": "W92",
       "reason": "Temporary custom resource - no reserved concurrency needed"
      }
     ]
    }
   }
  },
  "WebConsoleAssets29CA09CF": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "WebConsoleAssetsProviderframeworkonEvent35FDF5FD",
      "Arn"
     ]
    },
    "UserPoolId": {
     "Ref": "DLTCognitoAuthDLTUserPoolFA41A712"
    },
    "PoolClientId": {
     "Ref": "DLTCognitoAuthDLTUserPoolClientA2F8B2DB"
    },
    "IdentityPoolId": {
     "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
    },
    "UserPoolDomain": {
     "Fn::Join": [
      "",
      [
       "dlt-",
       {
        "Fn::GetAtt": [
         "DLTCustomResourcesCustomResourceUuidD1C03F15",
         "UUID"
        ]
       },
       {
        "Fn::If": [
         "DLTCognitoAuthIsGovCloudPartition9F5A131A",
         ".auth-fips.",
         ".auth."
        ]
       },
       {
        "Ref": "AWS::Region"
       },
       ".amazoncognito.com"
      ]
     ]
    },
    "ApiEndpoint": {
     "Fn::Join": [
      "",
      [
       "https://",
       {
        "Ref": "DLTApi0C903EB5"
       },
       ".execute-api.",
       {
        "Ref": "AWS::Region"
       },
       ".",
       {
        "Ref": "AWS::URLSuffix"
       },
       "/",
       {
        "Ref": "DLTApiDeploymentStageprodC81F8DCB"
       }
      ]
     ]
    },
    "UserFilesBucket": {
     "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
    },
    "UserFilesBucketRegion": {
     "Ref": "AWS::Region"
    },
    "IoTEndpoint": {
     "Fn::GetAtt": [
      "DLTCustomResourcesGetIotEndpoint700ABCC8",
      "IOT_ENDPOINT"
     ]
    },
    "IoTPolicy": {
     "Ref": "DLTCognitoAuthIoTPolicyB8FDFE53"
    },
    "DestinationBucket": {
     "Ref": "DLTConsoleResourcesConsoleBucket8C91CC58"
    },
    "DestinationKey": "dlt-web-console.zip",
    "SolutionVersion": "v4.1.0"
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "MCPServerDLTResourceServerF9088637": {
   "Type": "AWS::Cognito::UserPoolResourceServer",
   "Properties": {
    "Identifier": "dlt-mcp-gateway",
    "Name": "DLT MCP Gateway Resource Server",
    "Scopes": [
     {
      "ScopeDescription": "Read access",
      "ScopeName": "read"
     }
    ],
    "UserPoolId": {
     "Ref": "DLTCognitoAuthDLTUserPoolFA41A712"
    }
   },
   "Condition": "DeployMCPServerCondition"
  },
  "MCPServerDLTUserPoolClientMachineToMachineF3DA2105": {
   "Type": "AWS::Cognito::UserPoolClient",
   "Properties": {
    "AllowedOAuthFlows": [
     "client_credentials"
    ],
    "AllowedOAuthFlowsUserPoolClient": true,
    "AllowedOAuthScopes": [
     {
      "Fn::Join": [
       "",
       [
        {
         "Ref": "MCPServerDLTResourceServerF9088637"
        },
        "/read"
       ]
      ]
     }
    ],
    "ClientName": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-userpool-client-m2m"
      ]
     ]
    },
    "ExplicitAuthFlows": [
     "ALLOW_REFRESH_TOKEN_AUTH"
    ],
    "GenerateSecret": true,
    "RefreshTokenValidity": 1440,
    "SupportedIdentityProviders": [
     "COGNITO"
    ],
    "TokenValidityUnits": {
     "RefreshToken": "minutes"
    },
    "UserPoolId": {
     "Ref": "DLTCognitoAuthDLTUserPoolFA41A712"
    }
   },
   "DependsOn": [
    "MCPServerDLTResourceServerF9088637"
   ],
   "Condition": "DeployMCPServerCondition"
  },
  "MCPServerMCPToolLambdaRole83B130EC": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Description": "IAM role for MCP Tool Lambda function",
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "execute-api:Invoke",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":execute-api:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":",
            {
             "Ref": "DLTApi0C903EB5"
            },
            "/*/GET/*"
           ]
          ]
         }
        },
        {
         "Action": [
          "logs:CreateLogGroup",
          "logs:CreateLogStream",
          "logs:PutLogEvents"
         ],
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":logs:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":log-group:/aws/lambda/*"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "MCPLambdaPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "F10",
       "reason": "requires in-line role permissions."
      }
     ]
    }
   },
   "Condition": "DeployMCPServerCondition"
  },
  "MCPServerMCPToolLambdaFunctionA0B6CA8F": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/1bc11925770d57b53b7f1faef25559de7149d1494af06aa60019f393758a67e9.zip"
    },
    "Description": "MCP Tool Lambda Function",
    "Environment": {
     "Variables": {
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      },
      "API_GATEWAY_ENDPOINT": {
       "Fn::Join": [
        "",
        [
         "https://",
         {
          "Ref": "DLTApi0C903EB5"
         },
         ".execute-api.",
         {
          "Ref": "AWS::Region"
         },
         ".",
         {
          "Ref": "AWS::URLSuffix"
         },
         "/",
         {
          "Ref": "DLTApiDeploymentStageprodC81F8DCB"
         }
        ]
       ]
      },
      "SCENARIOS_BUCKET_NAME": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic"
     }
    },
    "Handler": "index.handler",
    "MemorySize": 512,
    "Role": {
     "Fn::GetAtt": [
      "MCPServerMCPToolLambdaRole83B130EC",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 60
   },
   "DependsOn": [
    "MCPServerMCPToolLambdaRole83B130EC"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W89",
       "reason": "VPC not needed for lambda"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   },
   "Condition": "DeployMCPServerCondition"
  },
  "MCPServerAgentCoreGatewayRole50366203": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "bedrock-agentcore.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Description": "IAM role for AgentCore Gateway",
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "bedrock-agentcore:GetGateway",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":bedrock-agentcore:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":gateway/dlt-mcp-server"
           ]
          ]
         }
        },
        {
         "Action": "lambda:InvokeFunction",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "MCPServerMCPToolLambdaFunctionA0B6CA8F",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "AgentCoreGatewayPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "F10",
       "reason": "requires in-line role permissions."
      }
     ]
    }
   },
   "Condition": "DeployMCPServerCondition"
  },
  "MCPServerAgentCoreGatewayConstructDltAgentCoreGatewayDBEF1612": {
   "Type": "AWS::BedrockAgentCore::Gateway",
   "Properties": {
    "AuthorizerConfiguration": {
     "CustomJWTAuthorizer": {
      "AllowedClients": [
       {
        "Ref": "DLTCognitoAuthDLTUserPoolClientA2F8B2DB"
       },
       {
        "Ref": "MCPServerDLTUserPoolClientMachineToMachineF3DA2105"
       }
      ],
      "DiscoveryUrl": {
       "Fn::Join": [
        "",
        [
         "https://cognito-idp.",
         {
          "Ref": "AWS::Region"
         },
         ".amazonaws.com/",
         {
          "Ref": "DLTCognitoAuthDLTUserPoolFA41A712"
         },
         "/.well-known/openid-configuration"
        ]
       ]
      }
     }
    },
    "AuthorizerType": "CUSTOM_JWT",
    "Description": "DLT MCP Server managed by AgentCore Gateway",
    "Name": "dlt-mcp-server",
    "ProtocolType": "MCP",
    "RoleArn": {
     "Fn::GetAtt": [
      "MCPServerAgentCoreGatewayRole50366203",
      "Arn"
     ]
    }
   },
   "Condition": "DeployMCPServerCondition"
  },
  "MCPServerAgentCoreGatewayTargetConstructDltAgentCoreGatewayTarget40580AC0": {
   "Type": "AWS::BedrockAgentCore::GatewayTarget",
   "Properties": {
    "CredentialProviderConfigurations": [
     {
      "CredentialProviderType": "GATEWAY_IAM_ROLE"
     }
    ],
    "Description": "Tool provider for DLT MCP server",
    "GatewayIdentifier": {
     "Fn::GetAtt": [
      "MCPServerAgentCoreGatewayConstructDltAgentCoreGatewayDBEF1612",
      "GatewayIdentifier"
     ]
    },
    "Name": "DltMcpToolsLambda",
    "TargetConfiguration": {
     "Mcp": {
      "Lambda": {
       "LambdaArn": {
        "Fn::GetAtt": [
         "MCPServerMCPToolLambdaFunctionA0B6CA8F",
         "Arn"
        ]
       },
       "ToolSchema": {
        "InlinePayload": [
         {
          "Description": "Retrieve a list of all available test scenarios",
          "InputSchema": {
           "Required": [],
           "Type": "object"
          },
          "Name": "list_scenarios"
         },
         {
          "Description": "Retrieve the test configuration and most recent test run for a single test scenario",
          "InputSchema": {
           "Properties": {
            "test_id": {
             "Description": "The test scenario's unique identifier",
             "Type": "string"
            }
           },
           "Required": [
            "test_id"
           ],
           "Type": "object"
          },
          "Name": "get_scenario_details"
         },
         {
          "Description": "Retrieve a list of test runs for a specific test scenario, sorted newest to oldest. More detailed results for a test run can be retrieved with \"get_test_run\". Note: Only one of 'limit' or 'start_timestamp' may be provided, not both. There is a maximum limit of 30 test runs returned.",
          "InputSchema": {
           "Properties": {
            "test_id": {
             "Description": "The test scenario's unique identifier",
             "Type": "string"
            },
            "limit": {
             "Description": "The maximum number of test runs to return (e.g. if I want the 10 most recent test runs, set the limit to 10). Cannot be used with start_timestamp parameter. Must be a positive integer. Default value is 20 and maximum limit is 30.",
             "Type": "integer"
            },
            "start_timestamp": {
             "Description": "Return all test runs going back to start_timestamp. The date must be in ISO 8601 timestamp format (e.g. '2024-01-15T14:30:00.000Z'). Cannot be used with limit parameter. Date format is strictly validated. There is a limit of 30 test runs that can be returned.",
             "Type": "string"
            }
           },
           "Required": [
            "test_id"
           ],
           "Type": "object"
          },
          "Name": "list_test_runs"
         },
         {
          "Description": "Retrieve a single test run for a specific test scenario. Results will be provided with a breakdown 1/ for each region (e.g. \"us-east-1\", \"us-west-2\") that the test runs in as well as an aggregate \"total\" 2/ for each endpoint (referred to as \"label\").",
          "InputSchema": {
           "Properties": {
            "test_id": {
             "Description": "The test scenario's unique identifier",
             "Type": "string"
            },
            "test_run_id": {
             "Description": "The test run's unique identifier",
             "Type": "string"
            }
           },
           "Required": [
            "test_id",
            "test_run_id"
           ],
           "Type": "object"
          },
          "Name": "get_test_run"
         },
         {
          "Description": "Retrieve the most recent test run for a specific test scenario",
          "InputSchema": {
           "Properties": {
            "test_id": {
             "Description": "The test scenario's unique identifier",
             "Type": "string"
            }
           },
           "Required": [
            "test_id"
           ],
           "Type": "object"
          },
          "Name": "get_latest_test_run"
         },
         {
          "Description": "Retrieve the baseline test run for a specific test scenario. Users are able to set a baseline run for comparisons",
          "InputSchema": {
           "Properties": {
            "test_id": {
             "Description": "The test scenario's unique identifier",
             "Type": "string"
            }
           },
           "Required": [
            "test_id"
           ],
           "Type": "object"
          },
          "Name": "get_baseline_test_run"
         },
         {
          "Description": "Retrieve the S3 bucket name and path prefix for test run output (logs, error files, results, etc). Starting in v4.0.0, each test run's artifacts will have a unique path that includes a concatenated prefix of timestamp + test run id (\"testRunPath\" in the response object). Test runs prior to v4.0.0 will live in a shared path without clear separation (\"testScenarioPath\" in the response object). If \"testRunPath\" has no objects, try falling back to \"testScenarioPath\" for the legacy artifact storage behavior.",
          "InputSchema": {
           "Properties": {
            "test_id": {
             "Description": "The test scenario's unique identifier",
             "Type": "string"
            },
            "test_run_id": {
             "Description": "The test run's unique identifier",
             "Type": "string"
            }
           },
           "Required": [
            "test_id",
            "test_run_id"
           ],
           "Type": "object"
          },
          "Name": "get_test_run_artifacts"
         }
        ]
       }
      }
     }
    }
   },
   "DependsOn": [
    "MCPServerAgentCoreGatewayConstructDltAgentCoreGatewayDBEF1612"
   ],
   "Condition": "DeployMCPServerCondition"
  },
  "SolutionMetricsNewMetricsLambdaServiceRole3196BDF4": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "ManagedPolicyArns": [
     {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
       ]
      ]
     }
    ]
   }
  },
  "SolutionMetricsNewMetricsLambdaServiceRoleDefaultPolicy3AE130AC": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "sqs:SendMessage",
        "sqs:GetQueueAttributes",
        "sqs:GetQueueUrl"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "SolutionMetricsNewLambdaToSqsToLambdalambdatosqsqueue2170C89E",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "sqs:ReceiveMessage",
        "sqs:ChangeMessageVisibility",
        "sqs:GetQueueUrl",
        "sqs:DeleteMessage",
        "sqs:GetQueueAttributes"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "SolutionMetricsNewLambdaToSqsToLambdalambdatosqsqueue2170C89E",
         "Arn"
        ]
       }
      },
      {
       "Action": "cloudwatch:GetMetricData",
       "Effect": "Allow",
       "Resource": "*"
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTaskRunnerLambdaLogGroupF801BE82",
         "Arn"
        ]
       }
      },
      {
       "Action": "logs:DescribeQueryDefinitions",
       "Effect": "Allow",
       "Resource": "*"
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "RealTimeDataRealTimeDataPublisherLogGroup3FE55F9A",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionResultsParserLambdaLogGroupADF0ADEA",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTaskCancellerLambdaLogGroupBD1D284E",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctiontaskStatusCheckerLambdaLogGroup1988969D",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestCleanupLambdaLogGroupC7B4FECA",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTApidltApiServicesLambdaLogGroup54338B12",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionStabilizationCheckerLambdaLogGroup42149834",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionStartCommandLambdaLogGroupB730B794",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionRegionalSyncLambdaLogGroup303B7022",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTaskFailureHandlerLambdaLogGroupE7AB6C96",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionOrphanCleanupLambdaLogGroupE96F9900",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionSFNFailureHandlerLambdaLogGroup967B3D84",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "SolutionMetricsNewMetricsLambdaServiceRoleDefaultPolicy3AE130AC",
    "Roles": [
     {
      "Ref": "SolutionMetricsNewMetricsLambdaServiceRole3196BDF4"
     }
    ]
   }
  },
  "SolutionMetricsNewMetricsLambda2B1B8902": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/e224023191ac76ba64afa9ae920f86c1b0fb0a23b5d616afbb745dbc45409af0.zip"
    },
    "Description": "Metrics util",
    "Environment": {
     "Variables": {
      "QUERY_PREFIX": {
       "Fn::Join": [
        "",
        [
         {
          "Ref": "AWS::StackName"
         },
         "-"
        ]
       ]
      },
      "SOLUTION_ID": "SO0062",
      "SOLUTION_NAME": "distributed-load-testing-on-aws",
      "SOLUTION_VERSION": "custom-v4.1.0",
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      },
      "EXECUTION_DAY": "MON",
      "SQS_QUEUE_URL": {
       "Ref": "SolutionMetricsNewLambdaToSqsToLambdalambdatosqsqueue2170C89E"
      }
     }
    },
    "Handler": "index.handler",
    "MemorySize": 128,
    "Role": {
     "Fn::GetAtt": [
      "SolutionMetricsNewMetricsLambdaServiceRole3196BDF4",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 60
   },
   "DependsOn": [
    "SolutionMetricsNewMetricsLambdaServiceRoleDefaultPolicy3AE130AC",
    "SolutionMetricsNewMetricsLambdaServiceRole3196BDF4"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "SolutionMetricsNewMetricsLambdaAwsEventsLambdaInvokePermission1458D855B": {
   "Type": "AWS::Lambda::Permission",
   "Properties": {
    "Action": "lambda:InvokeFunction",
    "FunctionName": {
     "Fn::GetAtt": [
      "SolutionMetricsNewMetricsLambda2B1B8902",
      "Arn"
     ]
    },
    "Principal": "events.amazonaws.com",
    "SourceArn": {
     "Fn::GetAtt": [
      "SolutionMetricsNewEventbridgeRuleToLambdaEventsRuleBB9E5FFD",
      "Arn"
     ]
    }
   }
  },
  "SolutionMetricsNewMetricsLambdaSqsEventSourcedistributedloadtestingonawsalbecsSolutionMetricsNewLambdaToSqsToLambdalambdatosqsqueue3D0C728B34369D32": {
   "Type": "AWS::Lambda::EventSourceMapping",
   "Properties": {
    "EventSourceArn": {
     "Fn::GetAtt": [
      "SolutionMetricsNewLambdaToSqsToLambdalambdatosqsqueue2170C89E",
      "Arn"
     ]
    },
    "FunctionName": {
     "Ref": "SolutionMetricsNewMetricsLambda2B1B8902"
    }
   }
  },
  "SolutionMetricsNewEventbridgeRuleToLambdaEventsRuleBB9E5FFD": {
   "Type": "AWS::Events::Rule",
   "Properties": {
    "ScheduleExpression": "cron(0 23 ? * MON *)",
    "State": "ENABLED",
    "Targets": [
     {
      "Arn": {
       "Fn::GetAtt": [
        "SolutionMetricsNewMetricsLambda2B1B8902",
        "Arn"
       ]
      },
      "Id": "Target0",
      "InputTransformer": {
       "InputPathsMap": {
        "time": "$.time",
        "detail-type": "$.detail-type"
       },
       "InputTemplate": {
        "Fn::Join": [
         "",
         [
          "{\"detail-type\": <detail-type>, \"time\": <time>, \"metrics-data-query\": [{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/Lambda\",\"Dimensions\":[{\"Name\":\"FunctionName\",\"Value\":\"",
          {
           "Ref": "DLTLambdaFunctionTaskRunnerNew5AE1A3C2"
          },
          "\"}],\"MetricName\":\"Invocations\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"TaskRunner\",\"Id\":\"id_AWS_Lambda_Invocations_TaskRunner\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/Lambda\",\"Dimensions\":[{\"Name\":\"FunctionName\",\"Value\":\"",
          {
           "Ref": "RealTimeDataRealTimeDataPublisherNew82D06000"
          },
          "\"}],\"MetricName\":\"Invocations\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"RealTimeDataPublisher\",\"Id\":\"id_AWS_Lambda_Invocations_RealTimeDataPublisher\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/Lambda\",\"Dimensions\":[{\"Name\":\"FunctionName\",\"Value\":\"",
          {
           "Ref": "DLTLambdaFunctionResultsParserNew4A490450"
          },
          "\"}],\"MetricName\":\"Invocations\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"ResultsParser\",\"Id\":\"id_AWS_Lambda_Invocations_ResultsParser\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/Lambda\",\"Dimensions\":[{\"Name\":\"FunctionName\",\"Value\":\"",
          {
           "Ref": "DLTLambdaFunctionTaskCancelerNewA6986F4A"
          },
          "\"}],\"MetricName\":\"Invocations\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"TaskCanceler\",\"Id\":\"id_AWS_Lambda_Invocations_TaskCanceler\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/Lambda\",\"Dimensions\":[{\"Name\":\"FunctionName\",\"Value\":\"",
          {
           "Ref": "DLTLambdaFunctionTaskStatusCheckerNew00D99653"
          },
          "\"}],\"MetricName\":\"Invocations\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"TaskStatusChecker\",\"Id\":\"id_AWS_Lambda_Invocations_TaskStatusChecker\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/Lambda\",\"Dimensions\":[{\"Name\":\"FunctionName\",\"Value\":\"",
          {
           "Ref": "DLTLambdaFunctionTestCleanupBBAA461F"
          },
          "\"}],\"MetricName\":\"Invocations\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"TestCleanup\",\"Id\":\"id_AWS_Lambda_Invocations_TestCleanup\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/Lambda\",\"Dimensions\":[{\"Name\":\"FunctionName\",\"Value\":\"",
          {
           "Ref": "DLTCustomResourceInfraCustomResourceLambdaA4053269"
          },
          "\"}],\"MetricName\":\"Invocations\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"CustomResourceLambda\",\"Id\":\"id_AWS_Lambda_Invocations_CustomResourceLambda\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/Lambda\",\"Dimensions\":[{\"Name\":\"FunctionName\",\"Value\":\"",
          {
           "Ref": "DLTLambdaFunctionStabilizationChecker9DA790EC"
          },
          "\"}],\"MetricName\":\"Invocations\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"StabilizationChecker\",\"Id\":\"id_AWS_Lambda_Invocations_StabilizationChecker\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/Lambda\",\"Dimensions\":[{\"Name\":\"FunctionName\",\"Value\":\"",
          {
           "Ref": "DLTLambdaFunctionStartCommand206D87C5"
          },
          "\"}],\"MetricName\":\"Invocations\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"StartCommand\",\"Id\":\"id_AWS_Lambda_Invocations_StartCommand\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/Lambda\",\"Dimensions\":[{\"Name\":\"FunctionName\",\"Value\":\"",
          {
           "Ref": "DLTLambdaFunctionRegionalSyncEF230066"
          },
          "\"}],\"MetricName\":\"Invocations\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"RegionalSync\",\"Id\":\"id_AWS_Lambda_Invocations_RegionalSync\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/Lambda\",\"Dimensions\":[{\"Name\":\"FunctionName\",\"Value\":\"",
          {
           "Ref": "DLTLambdaFunctionTaskFailureHandlerCB3B514D"
          },
          "\"}],\"MetricName\":\"Invocations\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"TaskFailureHandler\",\"Id\":\"id_AWS_Lambda_Invocations_TaskFailureHandler\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/Lambda\",\"Dimensions\":[{\"Name\":\"FunctionName\",\"Value\":\"",
          {
           "Ref": "DLTLambdaFunctionOrphanCleanup13860457"
          },
          "\"}],\"MetricName\":\"Invocations\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"OrphanCleanup\",\"Id\":\"id_AWS_Lambda_Invocations_OrphanCleanup\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/Lambda\",\"Dimensions\":[{\"Name\":\"FunctionName\",\"Value\":\"",
          {
           "Ref": "DLTLambdaFunctionSFNFailureHandler928EB56D"
          },
          "\"}],\"MetricName\":\"Invocations\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"SFNFailureHandler\",\"Id\":\"id_AWS_Lambda_Invocations_SFNFailureHandler\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/DynamoDB\",\"Dimensions\":[{\"Name\":\"TableName\",\"Value\":\"",
          {
           "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
          },
          "\"}],\"MetricName\":\"ConsumedReadCapacityUnits\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"ScenariosTable\",\"Id\":\"id_AWS_DynamoDB_ConsumedReadCapacityUnits_ScenariosTable\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/DynamoDB\",\"Dimensions\":[{\"Name\":\"TableName\",\"Value\":\"",
          {
           "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC"
          },
          "\"}],\"MetricName\":\"ConsumedReadCapacityUnits\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"HistoryTable\",\"Id\":\"id_AWS_DynamoDB_ConsumedReadCapacityUnits_HistoryTable\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/DynamoDB\",\"Dimensions\":[{\"Name\":\"TableName\",\"Value\":\"",
          {
           "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
          },
          "\"}],\"MetricName\":\"ConsumedWriteCapacityUnits\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"ScenariosTable\",\"Id\":\"id_AWS_DynamoDB_ConsumedWriteCapacityUnits_ScenariosTable\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"AWS/DynamoDB\",\"Dimensions\":[{\"Name\":\"TableName\",\"Value\":\"",
          {
           "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC"
          },
          "\"}],\"MetricName\":\"ConsumedWriteCapacityUnits\"},\"Stat\":\"Sum\",\"Period\":604800},\"identifier\":\"HistoryTable\",\"Id\":\"id_AWS_DynamoDB_ConsumedWriteCapacityUnits_HistoryTable\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"ECS/ContainerInsights\",\"Dimensions\":[{\"Name\":\"ClusterName\",\"Value\":\"",
          {
           "Ref": "DLTEcsDLTEcsClusterBC5CE23B"
          },
          "\"}],\"MetricName\":\"CpuUtilized\"},\"Stat\":\"Average\",\"Period\":604800},\"Id\":\"id_ECS_ContainerInsights_CpuUtilized\"},{\"MetricStat\":{\"Metric\":{\"Namespace\":\"ECS/ContainerInsights\",\"Dimensions\":[{\"Name\":\"ClusterName\",\"Value\":\"",
          {
           "Ref": "DLTEcsDLTEcsClusterBC5CE23B"
          },
          "\"}],\"MetricName\":\"MemoryUtilized\"},\"Stat\":\"Average\",\"Period\":604800},\"Id\":\"id_ECS_ContainerInsights_MemoryUtilized\"}]}"
         ]
        ]
       }
      }
     }
    ]
   }
  },
  "SolutionMetricsNewLambdaToSqsToLambdalambdatosqsqueue2170C89E": {
   "Type": "AWS::SQS::Queue",
   "Properties": {
    "DelaySeconds": 900,
    "KmsMasterKeyId": "alias/aws/sqs",
    "MaximumMessageSize": 1024,
    "MessageRetentionPeriod": 86400,
    "ReceiveMessageWaitTimeSeconds": 20,
    "VisibilityTimeout": 1020
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "SolutionMetricsNewLambdaToSqsToLambdalambdatosqsqueuePolicyBC7BA156": {
   "Type": "AWS::SQS::QueuePolicy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "sqs:DeleteMessage",
        "sqs:ReceiveMessage",
        "sqs:SendMessage",
        "sqs:GetQueueAttributes",
        "sqs:RemovePermission",
        "sqs:AddPermission",
        "sqs:SetQueueAttributes"
       ],
       "Effect": "Allow",
       "Principal": {
        "AWS": {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":iam::",
           {
            "Ref": "AWS::AccountId"
           },
           ":root"
          ]
         ]
        }
       },
       "Resource": {
        "Fn::GetAtt": [
         "SolutionMetricsNewLambdaToSqsToLambdalambdatosqsqueue2170C89E",
         "Arn"
        ]
       },
       "Sid": "QueueOwnerOnlyAccess"
      },
      {
       "Action": "SQS:*",
       "Condition": {
        "Bool": {
         "aws:SecureTransport": "false"
        }
       },
       "Effect": "Deny",
       "Principal": {
        "AWS": "*"
       },
       "Resource": {
        "Fn::GetAtt": [
         "SolutionMetricsNewLambdaToSqsToLambdalambdatosqsqueue2170C89E",
         "Arn"
        ]
       },
       "Sid": "HttpsOnly"
      }
     ],
     "Version": "2012-10-17"
    },
    "Queues": [
     {
      "Ref": "SolutionMetricsNewLambdaToSqsToLambdalambdatosqsqueue2170C89E"
     }
    ]
   }
  },
  "SolutionMetricsNewBilledDurationMemorySizeQueryTaskRunner05326AF3": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionTaskRunnerLambdaLogGroupF801BE82"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-BilledDurationMemorySizeQueryTaskRunner"
      ]
     ]
    },
    "QueryString": "stats sum(@billedDuration) as AWSLambdaBilledDurationTaskRunner, max(@memorySize) as AWSLambdaMemorySizeTaskRunner"
   }
  },
  "SolutionMetricsNewBilledDurationMemorySizeQueryRealTimeDataPublisher21A4FF87": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "RealTimeDataRealTimeDataPublisherLogGroup3FE55F9A"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-BilledDurationMemorySizeQueryRealTimeDataPublisher"
      ]
     ]
    },
    "QueryString": "stats sum(@billedDuration) as AWSLambdaBilledDurationRealTimeDataPublisher, max(@memorySize) as AWSLambdaMemorySizeRealTimeDataPublisher"
   }
  },
  "SolutionMetricsNewBilledDurationMemorySizeQueryResultsParser6748969C": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionResultsParserLambdaLogGroupADF0ADEA"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-BilledDurationMemorySizeQueryResultsParser"
      ]
     ]
    },
    "QueryString": "stats sum(@billedDuration) as AWSLambdaBilledDurationResultsParser, max(@memorySize) as AWSLambdaMemorySizeResultsParser"
   }
  },
  "SolutionMetricsNewBilledDurationMemorySizeQueryTaskCancelerFF6661A9": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionTaskCancellerLambdaLogGroupBD1D284E"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-BilledDurationMemorySizeQueryTaskCanceler"
      ]
     ]
    },
    "QueryString": "stats sum(@billedDuration) as AWSLambdaBilledDurationTaskCanceler, max(@memorySize) as AWSLambdaMemorySizeTaskCanceler"
   }
  },
  "SolutionMetricsNewBilledDurationMemorySizeQueryTaskStatusChecker7F1AFE94": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctiontaskStatusCheckerLambdaLogGroup1988969D"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-BilledDurationMemorySizeQueryTaskStatusChecker"
      ]
     ]
    },
    "QueryString": "stats sum(@billedDuration) as AWSLambdaBilledDurationTaskStatusChecker, max(@memorySize) as AWSLambdaMemorySizeTaskStatusChecker"
   }
  },
  "SolutionMetricsNewBilledDurationMemorySizeQueryTestCleanup132BE627": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionTestCleanupLambdaLogGroupC7B4FECA"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-BilledDurationMemorySizeQueryTestCleanup"
      ]
     ]
    },
    "QueryString": "stats sum(@billedDuration) as AWSLambdaBilledDurationTestCleanup, max(@memorySize) as AWSLambdaMemorySizeTestCleanup"
   }
  },
  "SolutionMetricsNewBilledDurationMemorySizeQueryApiLambdaF458D542": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTApidltApiServicesLambdaLogGroup54338B12"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-BilledDurationMemorySizeQueryApiLambda"
      ]
     ]
    },
    "QueryString": "stats sum(@billedDuration) as AWSLambdaBilledDurationApiLambda, max(@memorySize) as AWSLambdaMemorySizeApiLambda"
   }
  },
  "SolutionMetricsNewBilledDurationMemorySizeQueryStabilizationChecker711311E1": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionStabilizationCheckerLambdaLogGroup42149834"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-BilledDurationMemorySizeQueryStabilizationChecker"
      ]
     ]
    },
    "QueryString": "stats sum(@billedDuration) as AWSLambdaBilledDurationStabilizationChecker, max(@memorySize) as AWSLambdaMemorySizeStabilizationChecker"
   }
  },
  "SolutionMetricsNewBilledDurationMemorySizeQueryStartCommand90EBB4FC": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionStartCommandLambdaLogGroupB730B794"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-BilledDurationMemorySizeQueryStartCommand"
      ]
     ]
    },
    "QueryString": "stats sum(@billedDuration) as AWSLambdaBilledDurationStartCommand, max(@memorySize) as AWSLambdaMemorySizeStartCommand"
   }
  },
  "SolutionMetricsNewBilledDurationMemorySizeQueryRegionalSync69DCBACA": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionRegionalSyncLambdaLogGroup303B7022"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-BilledDurationMemorySizeQueryRegionalSync"
      ]
     ]
    },
    "QueryString": "stats sum(@billedDuration) as AWSLambdaBilledDurationRegionalSync, max(@memorySize) as AWSLambdaMemorySizeRegionalSync"
   }
  },
  "SolutionMetricsNewBilledDurationMemorySizeQueryTaskFailureHandler7FBE47E6": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionTaskFailureHandlerLambdaLogGroupE7AB6C96"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-BilledDurationMemorySizeQueryTaskFailureHandler"
      ]
     ]
    },
    "QueryString": "stats sum(@billedDuration) as AWSLambdaBilledDurationTaskFailureHandler, max(@memorySize) as AWSLambdaMemorySizeTaskFailureHandler"
   }
  },
  "SolutionMetricsNewBilledDurationMemorySizeQueryOrphanCleanupC901D949": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionOrphanCleanupLambdaLogGroupE96F9900"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-BilledDurationMemorySizeQueryOrphanCleanup"
      ]
     ]
    },
    "QueryString": "stats sum(@billedDuration) as AWSLambdaBilledDurationOrphanCleanup, max(@memorySize) as AWSLambdaMemorySizeOrphanCleanup"
   }
  },
  "SolutionMetricsNewBilledDurationMemorySizeQuerySFNFailureHandler89EBD787": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionSFNFailureHandlerLambdaLogGroup967B3D84"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-BilledDurationMemorySizeQuerySFNFailureHandler"
      ]
     ]
    },
    "QueryString": "stats sum(@billedDuration) as AWSLambdaBilledDurationSFNFailureHandler, max(@memorySize) as AWSLambdaMemorySizeSFNFailureHandler"
   }
  },
  "CDKMetadata": {
   "Type": "AWS::CDK::Metadata",
   "Properties": {
    "Analytics": "v2:deflate64:H4sIAAAAAAAA/31VW2/bOgz+LXtXtDbb3k/qtkOBdidLerLHgpYZR40iuSKVIjD83w8k2Y57wV7MjxdRpHjxXLbzH9/lxRd4pZmq9jOjS9muGdReFFu7BA8HZPSRWQWDkT5A02hbR1g4W2nWzgp4pacW1Vy2xdZulkXUrkNpkSO6s4zeIv8Exlc4JW8uMD5CmX1ulkWvWzCD2h3Q8mh19nU+tCBySkO6e9MosQyl0aq/cen1ERh7rne8adSNrRqns+fNshjZFN4WFE5t1qiC13z66V1oUgh/FdzUHok+iO9skndCw0G2S2e0Sun3aOVy/pF2gr7J9iqofX60HmVyPvmGz8wVEHbCwKGs4Mm6Cp9J/krkNliV3oi+PQERMslFJL1xqtZoE8NCf9BEkRvFN0e0vHbBK5yU/qO0E6i8jE6CMY8770K9K0DtMDUOKpJtYQL13TTAW/A1xKLS/hq32uohlPcSZxm0RT+R9WfX6I9a5TbJsBPG1STbe1eP1RrxOpSkvG6ii1tt+ng+kf4O6E9vg3on6gQaINbKOKhKMGCVtvVxLttF0xitUn/eO6iuki7f9Iaf2mlitL3NgCf6R/A18pjPhO3EK2yPefb+YLko7sWIpoOSX6HWti6c3eo6eMhZVCcLB1eVsh0nMoFOKONC9QqsdrJdGPCHqEugExhbgGQ7LIZIO0GMzbbvHZLtOiiFWIklEIkHaESxc7FYf0CzWDMwPoDaaZvLN+HfeXpioD3J+9S3d/bo9iig0XUebtmukHjR6BTHGS6UcsGyuMbGuNOwVSbcmqEerq5RrJBSS8eJEg/IO1ellZfRoO0vyXiFLwGJN2B0Bezyqnwn64R2LM9jr1xtNTvZ/kfol86ZeGiK7119jUYf0Z/elGpqd+0OoK0Y2MLoPr2PkrsKLWs+De6nfFw9b5fucD7S0f2Qb5yw3KOfazpRYuWd2kONlpXzmNpysvl7mPu3E/RCsv0dMGA/YAFF+p5X3oTtOpEWWCxX3ETTkvwbuAksikDsDp/WSiXVk+95kkvvjrqKUV9eXMjLL//E/yA5E1LPzZSzxD4opq9R0aaOL72uapz1G/TmLHp0uTv75Tpr6YUGs6x5dOsXGs1i5hN5eorBfmLXdSLudPlMX4/z7/Iy/q6fSeuZD5b1AeUq0/8BS34RGcwHAAA="
   },
   "Condition": "CDKMetadataAvailable"
  }
 },
 "Outputs": {
  "ALBDnsName": {
   "Description": "ALB DNS name",
   "Value": {
    "Fn::GetAtt": [
     "DLTConsoleResourcesWebConsoleAlb08993363",
     "DNSName"
    ]
   }
  },
  "DLTApiEndpointD98B09AC": {
   "Value": {
    "Fn::Join": [
     "",
     [
      "https://",
      {
       "Ref": "DLTApi0C903EB5"
      },
      ".execute-api.",
      {
       "Ref": "AWS::Region"
      },
      ".",
      {
       "Ref": "AWS::URLSuffix"
      },
      "/",
      {
       "Ref": "DLTApiDeploymentStageprodC81F8DCB"
      },
      "/"
     ]
    ]
   }
  },
  "ConsoleURL": {
   "Description": "Web portal for DLT",
   "Value": {
    "Fn::Join": [
     "",
     [
      "https://",
      {
       "Ref": "ConsoleDomainName"
      }
     ]
    ]
   }
  },
  "ConsoleResourceBucket": {
   "Description": "Resource Bucket for Web Portal",
   "Value": {
    "Ref": "DLTConsoleResourcesConsoleBucket8C91CC58"
   }
  },
  "SolutionUUID": {
   "Description": "Unique ID for deployment",
   "Value": {
    "Fn::GetAtt": [
     "DLTCustomResourcesCustomResourceUuidD1C03F15",
     "UUID"
    ]
   }
  },
  "SolutionTemplate": {
   "Description": "Identifies which published DLT template produced the hub stack. Consumed by the DLT console and API to render upgrade guidance.",
   "Value": "alb-ecs"
  },
  "ScenariosBucket": {
   "Description": "Common storage bucket for test scenarios",
   "Value": {
    "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
   }
  },
  "ScenariosTable": {
   "Description": "Common table for storing load test details",
   "Value": {
    "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
   }
  },
  "LambdaTaskRoleArn": {
   "Description": "Lambda task role ARN for regional deployments",
   "Value": {
    "Fn::GetAtt": [
     "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD",
     "Arn"
    ]
   }
  },
  "RegionalCFTemplate": {
   "Description": "S3 URL for regional CloudFormation template",
   "Value": {
    "Fn::Join": [
     "",
     [
      "https://s3.",
      {
       "Ref": "AWS::Region"
      },
      ".",
      {
       "Ref": "AWS::URLSuffix"
      },
      "/",
      {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "/regional-template/distributed-load-testing-on-aws-regional.template"
     ]
    ]
   },
   "Export": {
    "Name": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-RegionalCFTemplate"
      ]
     ]
    }
   }
  },
  "CognitoUserPoolID": {
   "Description": "Cognito User Pool ID",
   "Value": {
    "Ref": "DLTCognitoAuthDLTUserPoolFA41A712"
   }
  },
  "CognitoAppClientID": {
   "Description": "Cognito App Client ID",
   "Value": {
    "Ref": "DLTCognitoAuthDLTUserPoolClientA2F8B2DB"
   }
  },
  "CognitoIdentityPoolID": {
   "Description": "Cognito Identity Pool ID",
   "Value": {
    "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
   }
  },
  "McpEndpoint": {
   "Description": "MCP Server Endpoint",
   "Value": {
    "Fn::GetAtt": [
     "MCPServerAgentCoreGatewayConstructDltAgentCoreGatewayDBEF1612",
     "GatewayUrl"
    ]
   },
   "Condition": "DeployMCPServerCondition"
  }
 }
}