{
 "Description": "(SO0062) - Distributed Load Testing on AWS. Fargate-based load testing with JMeter, K6, and Locust. CloudFront web console. Version v4.3.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": "Load tester container image configuration"
     },
     "Parameters": [
      "UseStableTagging",
      "LoadTesterImageUri",
      "LocustLoadTesterImageUri",
      "K6LoadTesterImageUri",
      "JMeterLoadTesterImageUri"
     ]
    }
   ],
   "ParameterLabels": {
    "AdminName": {
     "default": "* Administrator Name"
    },
    "AdminEmail": {
     "default": "* Administrator Email"
    },
    "DeployMCPServer": {
     "default": "Deploy MCP Server"
    },
    "MCPServerAccessMode": {
     "default": "MCP Server Access Mode"
    },
    "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"
    },
    "LoadTesterImageUri": {
     "default": "Load Tester Container Image"
    },
    "LocustLoadTesterImageUri": {
     "default": "Locust Load Tester Container Image"
    },
    "K6LoadTesterImageUri": {
     "default": "k6 Load Tester Container Image"
    },
    "JMeterLoadTesterImageUri": {
     "default": "JMeter Load Tester Container Image"
    }
   }
  }
 },
 "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"
  },
  "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": "^$|^(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}/(3[0-2]|[12]?\\d)$",
   "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": "^$|^(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}/(3[0-2]|[12]?\\d)$",
   "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": "^$|^(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}/(3[0-2]|[12]?\\d)$",
   "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": "^(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}/(3[0-2]|[12]?\\d)$",
   "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"
  },
  "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."
  },
  "LoadTesterImageUri": {
   "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 load tester container image. If empty, the default public image is used."
  },
  "LocustLoadTesterImageUri": {
   "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 Locust load tester container image. If empty, the default public image is used."
  },
  "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."
  },
  "MCPServerAccessMode": {
   "Type": "String",
   "Default": "ReadOnly",
   "AllowedValues": [
    "ReadWrite",
    "ReadOnly"
   ],
   "Description": "Controls whether the MCP server can perform mutating operations (create, update, delete tests). Only applies when Deploy MCP Server is Yes."
  },
  "K6LoadTesterImageUri": {
   "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 k6 load tester container image. If empty, the default public image is used."
  },
  "JMeterLoadTesterImageUri": {
   "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 JMeter load tester container image. If empty, the default public image is used."
  }
 },
 "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.3.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"
   ]
  },
  "UsePublicLoadTestingImageCondition": {
   "Fn::Equals": [
    {
     "Ref": "LoadTesterImageUri"
    },
    ""
   ]
  },
  "UsePublicLocustLoadTestingImageCondition": {
   "Fn::Equals": [
    {
     "Ref": "LocustLoadTesterImageUri"
    },
    ""
   ]
  },
  "UsePublicK6LoadTestingImageCondition": {
   "Fn::Equals": [
    {
     "Ref": "K6LoadTesterImageUri"
    },
    ""
   ]
  },
  "UsePublicJMeterLoadTestingImageCondition": {
   "Fn::Equals": [
    {
     "Ref": "JMeterLoadTesterImageUri"
    },
    ""
   ]
  },
  "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"
   ]
  },
  "MCPServerIsReadWriteCondition7036A529": {
   "Fn::Equals": [
    {
     "Ref": "MCPServerAccessMode"
    },
    "ReadWrite"
   ]
  },
  "DeployMCPServerAndIsReadWriteCondition": {
   "Fn::And": [
    {
     "Condition": "DeployMCPServerCondition"
    },
    {
     "Condition": "MCPServerIsReadWriteCondition7036A529"
    }
   ]
  },
  "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"
            ]
           },
           "/*"
          ]
         ]
        }
       ]
      }
     ],
     "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": [
        "dynamodb:BatchGetItem",
        "dynamodb:Query",
        "dynamodb:GetItem",
        "dynamodb:Scan",
        "dynamodb:ConditionCheckItem",
        "dynamodb:DescribeTable"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTTestRunnerStorageDLTHistoryTable46D850CC",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTTestRunnerStorageDLTHistoryTable46D850CC",
             "Arn"
            ]
           },
           "/index/*"
          ]
         ]
        }
       ]
      },
      {
       "Action": [
        "dynamodb:GetRecords",
        "dynamodb:GetShardIterator"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTTestRunnerStorageDLTHistoryTable46D850CC",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTTestRunnerStorageDLTHistoryTable46D850CC",
             "Arn"
            ]
           },
           "/index/*"
          ]
         ]
        }
       ]
      },
      {
       "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": [
        "cloudfront:GetResponseHeadersPolicy",
        "cloudfront:UpdateResponseHeadersPolicy"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":cloudfront::",
          {
           "Ref": "AWS::AccountId"
          },
          ":response-headers-policy/",
          {
           "Ref": "DLTConsoleResourcesDLTDashboardS3ResponseHeadersPolicyA894BC19"
          }
         ]
        ]
       }
      },
      {
       "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.3.0/41273638c1a19f16ba94a18964676f018fedd1c08937373194f64998ac7404b2.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.3.0",
      "MAIN_REGION": {
       "Ref": "AWS::Region"
      },
      "S3_BUCKET": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "DDB_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "HISTORY_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC"
      }
     }
    },
    "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"
      }
     ]
    }
   }
  },
  "DLTConsoleResourcesDLTDashboardS3S3Bucket8E2568BB": {
   "Type": "AWS::S3::Bucket",
   "Properties": {
    "BucketEncryption": {
     "ServerSideEncryptionConfiguration": [
      {
       "ServerSideEncryptionByDefault": {
        "SSEAlgorithm": "AES256"
       }
      }
     ]
    },
    "LifecycleConfiguration": {
     "Rules": [
      {
       "NoncurrentVersionTransitions": [
        {
         "StorageClass": "GLACIER",
         "TransitionInDays": 90
        }
       ],
       "Status": "Enabled"
      }
     ]
    },
    "LoggingConfiguration": {
     "DestinationBucketName": {
      "Ref": "DLTCommonResourcesLogsBucket48A2774D"
     },
     "LogFilePrefix": "console-bucket-access/"
    },
    "PublicAccessBlockConfiguration": {
     "BlockPublicAcls": true,
     "BlockPublicPolicy": true,
     "IgnorePublicAcls": true,
     "RestrictPublicBuckets": true
    },
    "Tags": [
     {
      "Key": "aws-cdk:cr-owned:153e9244",
      "Value": "true"
     }
    ],
    "VersioningConfiguration": {
     "Status": "Enabled"
    }
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain"
  },
  "DLTConsoleResourcesDLTDashboardS3S3BucketPolicy85582FEA": {
   "Type": "AWS::S3::BucketPolicy",
   "Properties": {
    "Bucket": {
     "Ref": "DLTConsoleResourcesDLTDashboardS3S3Bucket8E2568BB"
    },
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "s3:*",
       "Condition": {
        "Bool": {
         "aws:SecureTransport": "false"
        }
       },
       "Effect": "Deny",
       "Principal": {
        "AWS": "*"
       },
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTConsoleResourcesDLTDashboardS3S3Bucket8E2568BB",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTConsoleResourcesDLTDashboardS3S3Bucket8E2568BB",
             "Arn"
            ]
           },
           "/*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "s3:GetObject",
       "Condition": {
        "StringEquals": {
         "AWS:SourceArn": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":cloudfront::",
            {
             "Ref": "AWS::AccountId"
            },
            ":distribution/",
            {
             "Ref": "DLTConsoleResourcesDLTDashboardS3CloudFrontDistribution1F11B8BB"
            }
           ]
          ]
         }
        }
       },
       "Effect": "Allow",
       "Principal": {
        "Service": "cloudfront.amazonaws.com"
       },
       "Resource": {
        "Fn::Join": [
         "",
         [
          {
           "Fn::GetAtt": [
            "DLTConsoleResourcesDLTDashboardS3S3Bucket8E2568BB",
            "Arn"
           ]
          },
          "/*"
         ]
        ]
       }
      },
      {
       "Action": "s3:ListBucket",
       "Condition": {
        "StringEquals": {
         "AWS:SourceArn": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":cloudfront::",
            {
             "Ref": "AWS::AccountId"
            },
            ":distribution/",
            {
             "Ref": "DLTConsoleResourcesDLTDashboardS3CloudFrontDistribution1F11B8BB"
            }
           ]
          ]
         }
        }
       },
       "Effect": "Allow",
       "Principal": {
        "Service": "cloudfront.amazonaws.com"
       },
       "Resource": {
        "Fn::GetAtt": [
         "DLTConsoleResourcesDLTDashboardS3S3Bucket8E2568BB",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    }
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "F16",
       "reason": "Public website bucket policy requires a wildcard principal"
      }
     ]
    }
   }
  },
  "DLTConsoleResourcesDLTDashboardS3CloudFrontOacE80000C5": {
   "Type": "AWS::CloudFront::OriginAccessControl",
   "Properties": {
    "OriginAccessControlConfig": {
     "Description": "Origin access control provisioned by aws-cloudfront-s3",
     "Name": {
      "Fn::Join": [
       "",
       [
        "aws-cloudfront-s3-DLTDardS3-",
        {
         "Fn::Select": [
          2,
          {
           "Fn::Split": [
            "/",
            {
             "Ref": "AWS::StackId"
            }
           ]
          }
         ]
        }
       ]
      ]
     },
     "OriginAccessControlOriginType": "s3",
     "SigningBehavior": "always",
     "SigningProtocol": "sigv4"
    }
   }
  },
  "DLTConsoleResourcesDLTDashboardS3ResponseHeadersPolicyA894BC19": {
   "Type": "AWS::CloudFront::ResponseHeadersPolicy",
   "Properties": {
    "ResponseHeadersPolicyConfig": {
     "Comment": "Security headers policy for DLT console",
     "CustomHeadersConfig": {
      "Items": [
       {
        "Header": "Permissions-Policy",
        "Override": true,
        "Value": "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()"
       },
       {
        "Header": "Cross-Origin-Resource-Policy",
        "Override": true,
        "Value": "same-origin"
       }
      ]
     },
     "Name": {
      "Fn::Join": [
       "-",
       [
        {
         "Ref": "AWS::StackName"
        },
        {
         "Ref": "AWS::Region"
        },
        "rhp"
       ]
      ]
     },
     "SecurityHeadersConfig": {
      "ContentSecurityPolicy": {
       "ContentSecurityPolicy": "default-src 'self' https://*.amazonaws.com; upgrade-insecure-requests; script-src 'self' https://*.amazonaws.com; style-src 'self' 'unsafe-inline' https://*.amazonaws.com; img-src 'self' data: https://*.amazonaws.com; font-src 'self' data:; connect-src 'self' https://*.amazonaws.com wss://*.amazonaws.com https://metrics.awssolutionsbuilder.com; frame-src 'self' https://*.amazonaws.com; frame-ancestors 'self' https://*.amazonaws.com; object-src 'none'; base-uri 'self'; form-action 'self' https://*.amazonaws.com;",
       "Override": true
      },
      "ContentTypeOptions": {
       "Override": true
      },
      "FrameOptions": {
       "FrameOption": "DENY",
       "Override": true
      },
      "ReferrerPolicy": {
       "Override": true,
       "ReferrerPolicy": "strict-origin-when-cross-origin"
      },
      "StrictTransportSecurity": {
       "AccessControlMaxAgeSec": 47304000,
       "IncludeSubdomains": true,
       "Override": true
      }
     }
    }
   }
  },
  "DLTConsoleResourcesDLTDashboardS3CloudFrontDistribution1F11B8BB": {
   "Type": "AWS::CloudFront::Distribution",
   "Properties": {
    "DistributionConfig": {
     "Comment": "Website distribution for the Distributed Load Testing solution",
     "CustomErrorResponses": [
      {
       "ErrorCode": 403,
       "ResponseCode": 200,
       "ResponsePagePath": "/index.html"
      },
      {
       "ErrorCode": 404,
       "ResponseCode": 200,
       "ResponsePagePath": "/index.html"
      }
     ],
     "DefaultCacheBehavior": {
      "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6",
      "Compress": true,
      "ResponseHeadersPolicyId": {
       "Ref": "DLTConsoleResourcesDLTDashboardS3ResponseHeadersPolicyA894BC19"
      },
      "TargetOriginId": "distributedloadtestingonawsDLTConsoleResourcesDLTDashboardS3CloudFrontDistributionOrigin1DF278B4A",
      "ViewerProtocolPolicy": "redirect-to-https"
     },
     "DefaultRootObject": "index.html",
     "Enabled": true,
     "HttpVersion": "http2",
     "IPV6Enabled": true,
     "Logging": {
      "Bucket": {
       "Fn::GetAtt": [
        "DLTCommonResourcesLogsBucket48A2774D",
        "RegionalDomainName"
       ]
      },
      "Prefix": "cloudfront-logs/"
     },
     "Origins": [
      {
       "DomainName": {
        "Fn::GetAtt": [
         "DLTConsoleResourcesDLTDashboardS3S3Bucket8E2568BB",
         "RegionalDomainName"
        ]
       },
       "Id": "distributedloadtestingonawsDLTConsoleResourcesDLTDashboardS3CloudFrontDistributionOrigin1DF278B4A",
       "OriginAccessControlId": {
        "Fn::GetAtt": [
         "DLTConsoleResourcesDLTDashboardS3CloudFrontOacE80000C5",
         "Id"
        ]
       },
       "S3OriginConfig": {
        "OriginAccessIdentity": ""
       }
      }
     ]
    }
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W70",
       "reason": "Since the distribution uses the CloudFront domain name, CloudFront automatically sets the security policy to TLSv1 regardless of the value of MinimumProtocolVersion"
      }
     ]
    }
   }
  },
  "DLTConsoleResourcesDeployWebsiteAwsCliLayer18BDB5D9": {
   "Type": "AWS::Lambda::LayerVersion",
   "Properties": {
    "Content": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.3.0/98f62bef9320f8c0a0a7be21d7c746f069131f196f51ffe3008a6bb730b368ec.zip"
    },
    "Description": "/opt/awscli/aws"
   }
  },
  "DLTConsoleResourcesDeployWebsiteCustomResource031F1BF7": {
   "Type": "Custom::CDKBucketDeployment",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536",
      "Arn"
     ]
    },
    "SourceBucketNames": [
     {
      "Fn::Sub": "solutions-${AWS::Region}"
     }
    ],
    "SourceObjectKeys": [
     "distributed-load-testing-on-aws/v4.3.0/2701b97c5815e097772aed8fa19f7a485087481ec85edc84f7283c976b28e419.zip"
    ],
    "DestinationBucketName": {
     "Ref": "DLTConsoleResourcesDLTDashboardS3S3Bucket8E2568BB"
    },
    "WaitForDistributionInvalidation": true,
    "Prune": true,
    "Exclude": [
     "aws-exports.json"
    ],
    "DistributionId": {
     "Ref": "DLTConsoleResourcesDLTDashboardS3CloudFrontDistribution1F11B8BB"
    },
    "DistributionPaths": [
     "/*"
    ],
    "OutputObjectKeys": true
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265": {
   "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"
       ]
      ]
     }
    ]
   }
  },
  "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRoleDefaultPolicy88902FDF": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "s3:GetObject*",
        "s3:GetBucket*",
        "s3:List*"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":s3:::",
           {
            "Fn::Sub": "solutions-${AWS::Region}"
           }
          ]
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":s3:::",
           {
            "Fn::Sub": "solutions-${AWS::Region}"
           },
           "/*"
          ]
         ]
        }
       ]
      },
      {
       "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::GetAtt": [
          "DLTConsoleResourcesDLTDashboardS3S3Bucket8E2568BB",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTConsoleResourcesDLTDashboardS3S3Bucket8E2568BB",
             "Arn"
            ]
           },
           "/*"
          ]
         ]
        }
       ]
      },
      {
       "Action": [
        "cloudfront:GetInvalidation",
        "cloudfront:CreateInvalidation"
       ],
       "Effect": "Allow",
       "Resource": "*"
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRoleDefaultPolicy88902FDF",
    "Roles": [
     {
      "Ref": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265"
     }
    ]
   }
  },
  "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.3.0/97e9ebf0b174a5c8f7faa505739022b7f509edddffcab9211dcd08b759944c4f.zip"
    },
    "Environment": {
     "Variables": {
      "AWS_CA_BUNDLE": "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem"
     }
    },
    "Handler": "index.handler",
    "Layers": [
     {
      "Ref": "DLTConsoleResourcesDeployWebsiteAwsCliLayer18BDB5D9"
     }
    ],
    "Role": {
     "Fn::GetAtt": [
      "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265",
      "Arn"
     ]
    },
    "Runtime": "python3.13",
    "Timeout": 900
   },
   "DependsOn": [
    "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRoleDefaultPolicy88902FDF",
    "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "Lambda function created by BucketDeployment has appropriate IAM permissions managed by CDK"
      },
      {
       "id": "W89",
       "reason": "Lambda function created by BucketDeployment does not need to be in a VPC as it only copies files to S3"
      },
      {
       "id": "W92",
       "reason": "Lambda function created by BucketDeployment is temporary and does not need reserved concurrency"
      }
     ]
    }
   }
  },
  "DLTTestRunnerStorageDLTScenariosBucketA9290D21": {
   "Type": "AWS::S3::Bucket",
   "Properties": {
    "BucketEncryption": {
     "ServerSideEncryptionConfiguration": [
      {
       "ServerSideEncryptionByDefault": {
        "SSEAlgorithm": "aws:kms"
       }
      }
     ]
    },
    "CorsConfiguration": {
     "CorsRules": [
      {
       "AllowedHeaders": [
        "*"
       ],
       "AllowedMethods": [
        "GET",
        "POST",
        "PUT",
        "HEAD"
       ],
       "AllowedOrigins": [
        {
         "Fn::Join": [
          "",
          [
           "https://",
           {
            "Fn::GetAtt": [
             "DLTConsoleResourcesDLTDashboardS3CloudFrontDistribution1F11B8BB",
             "DomainName"
            ]
           }
          ]
         ]
        }
       ],
       "ExposedHeaders": [
        "ETag"
       ]
      }
     ]
    },
    "LifecycleConfiguration": {
     "Rules": [
      {
       "AbortIncompleteMultipartUpload": {
        "DaysAfterInitiation": 1
       },
       "Status": "Enabled"
      }
     ]
    },
    "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"
  },
  "DLTCustomResourcesUpdateCloudFrontCspCEAC2D6B": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "Resource": "UpdateCsp",
    "ResponseHeadersPolicyId": {
     "Ref": "DLTConsoleResourcesDLTDashboardS3ResponseHeadersPolicyA894BC19"
    },
    "CognitoDomain": {
     "Fn::Join": [
      "",
      [
       "dlt-",
       {
        "Fn::GetAtt": [
         "DLTCustomResourcesCustomResourceUuidD1C03F15",
         "UUID"
        ]
       },
       {
        "Fn::If": [
         "DLTCognitoAuthIsGovCloudPartition9F5A131A",
         ".auth-fips.",
         ".auth."
        ]
       },
       {
        "Ref": "AWS::Region"
       },
       ".amazoncognito.com"
      ]
     ]
    }
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCustomResourcesCleanUpTestScenariosB69DD18C": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "Resource": "CleanUpTestScenarios"
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCustomResourcesBackfillTestRunCountsB60858D5": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "Resource": "BackfillTestRunCounts"
   },
   "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.3.0",
    "DestBucket": {
     "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
    },
    "MainRegionLambdaTaskRoleArn": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD",
      "Arn"
     ]
    },
    "ScenariosTable": {
     "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
    },
    "MainRegionStack": {
     "Ref": "AWS::Region"
    },
    "Timestamp": "1790280307682"
   },
   "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.3.0",
    "DestBucket": {
     "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
    },
    "Timestamp": "1790280307683"
   },
   "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"
     },
     "nativeTaskDefinitions": {
      "jmeter": {
       "Ref": "DLTEcsJMeterDLTTaskDefinition10282190"
      },
      "k6": {
       "Ref": "DLTEcsK6DLTTaskDefinition77A77961"
      },
      "locust": {
       "Ref": "DLTEcsLocustDLTTaskDefinitionB23B7E33"
      }
     },
     "taskCluster": {
      "Ref": "DLTEcsDLTEcsClusterBC5CE23B"
     },
     "version": "v4.3.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",
          "s3:AbortMultipartUpload"
         ],
         "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 -XX:+ExitOnOutOfMemoryError -XX:-HeapDumpOnOutOfMemoryError"
       }
      ],
      "Essential": true,
      "HealthCheck": {
       "Command": [
        "CMD-SHELL",
        "test -f /tmp/health_ready || exit 1"
       ],
       "Interval": 5,
       "Retries": 10,
       "StartPeriod": 120,
       "Timeout": 5
      },
      "Image": {
       "Fn::If": [
        "UsePublicLoadTestingImageCondition",
        {
         "Fn::If": [
          "UseStableTagCondition",
          "public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-load-tester:v4.3_stable",
          "public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-load-tester:v4.3.0"
         ]
        },
        {
         "Ref": "LoadTesterImageUri"
        }
       ]
      },
      "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"
        ]
       ]
      },
      "StopTimeout": 120
     }
    ],
    "Cpu": "2048",
    "ExecutionRoleArn": {
     "Fn::GetAtt": [
      "DLTEcsDLTTaskExecutionRoleDE668717",
      "Arn"
     ]
    },
    "Family": "distributedloadtestingonawsDLTEcsDLTTaskDefinitionFFD96F9E",
    "Memory": "4096",
    "NetworkMode": "awsvpc",
    "RequiresCompatibilities": [
     "FARGATE"
    ],
    "Tags": [
     {
      "Key": "SolutionId",
      "Value": "SO0062"
     }
    ],
    "TaskRoleArn": {
     "Fn::GetAtt": [
      "DLTEcsDLTTaskRoleD37E29C5",
      "Arn"
     ]
    }
   }
  },
  "DLTEcsLocustDLTTaskDefinitionB23B7E33": {
   "Type": "AWS::ECS::TaskDefinition",
   "Properties": {
    "ContainerDefinitions": [
     {
      "Essential": true,
      "HealthCheck": {
       "Command": [
        "CMD-SHELL",
        "test -f /tmp/health_ready || exit 1"
       ],
       "Interval": 5,
       "Retries": 10,
       "StartPeriod": 180,
       "Timeout": 5
      },
      "Image": {
       "Fn::If": [
        "UsePublicLocustLoadTestingImageCondition",
        {
         "Fn::If": [
          "UseStableTagCondition",
          "public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-load-tester-locust:v4.3_stable",
          "public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-load-tester-locust:v4.3.0"
         ]
        },
        {
         "Ref": "LocustLoadTesterImageUri"
        }
       ]
      },
      "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-locust"
        ]
       ]
      },
      "StopTimeout": 120
     }
    ],
    "Cpu": "2048",
    "ExecutionRoleArn": {
     "Fn::GetAtt": [
      "DLTEcsDLTTaskExecutionRoleDE668717",
      "Arn"
     ]
    },
    "Family": "distributedloadtestingonawsDLTEcsLocustDLTTaskDefinitionCF89FCEC",
    "Memory": "4096",
    "NetworkMode": "awsvpc",
    "RequiresCompatibilities": [
     "FARGATE"
    ],
    "Tags": [
     {
      "Key": "SolutionId",
      "Value": "SO0062"
     }
    ],
    "TaskRoleArn": {
     "Fn::GetAtt": [
      "DLTEcsDLTTaskRoleD37E29C5",
      "Arn"
     ]
    }
   }
  },
  "DLTEcsK6DLTTaskDefinition77A77961": {
   "Type": "AWS::ECS::TaskDefinition",
   "Properties": {
    "ContainerDefinitions": [
     {
      "Essential": true,
      "HealthCheck": {
       "Command": [
        "CMD-SHELL",
        "test -f /tmp/health_ready || exit 1"
       ],
       "Interval": 5,
       "Retries": 10,
       "StartPeriod": 180,
       "Timeout": 5
      },
      "Image": {
       "Fn::If": [
        "UsePublicK6LoadTestingImageCondition",
        {
         "Fn::If": [
          "UseStableTagCondition",
          "public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-load-tester-k6:v4.3_stable",
          "public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-load-tester-k6:v4.3.0"
         ]
        },
        {
         "Ref": "K6LoadTesterImageUri"
        }
       ]
      },
      "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-k6"
        ]
       ]
      },
      "StopTimeout": 120
     }
    ],
    "Cpu": "2048",
    "ExecutionRoleArn": {
     "Fn::GetAtt": [
      "DLTEcsDLTTaskExecutionRoleDE668717",
      "Arn"
     ]
    },
    "Family": "distributedloadtestingonawsDLTEcsK6DLTTaskDefinitionFE1B3D0D",
    "Memory": "4096",
    "NetworkMode": "awsvpc",
    "RequiresCompatibilities": [
     "FARGATE"
    ],
    "Tags": [
     {
      "Key": "SolutionId",
      "Value": "SO0062"
     }
    ],
    "TaskRoleArn": {
     "Fn::GetAtt": [
      "DLTEcsDLTTaskRoleD37E29C5",
      "Arn"
     ]
    }
   }
  },
  "DLTEcsJMeterDLTTaskDefinition10282190": {
   "Type": "AWS::ECS::TaskDefinition",
   "Properties": {
    "ContainerDefinitions": [
     {
      "Environment": [
       {
        "Name": "JVM_ARGS",
        "Value": "-Xms1g -Xmx3g -XX:+ExitOnOutOfMemoryError -XX:-HeapDumpOnOutOfMemoryError"
       }
      ],
      "Essential": true,
      "HealthCheck": {
       "Command": [
        "CMD-SHELL",
        "test -f /tmp/health_ready || exit 1"
       ],
       "Interval": 5,
       "Retries": 10,
       "StartPeriod": 120,
       "Timeout": 5
      },
      "Image": {
       "Fn::If": [
        "UsePublicJMeterLoadTestingImageCondition",
        {
         "Fn::If": [
          "UseStableTagCondition",
          "public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-load-tester-jmeter:v4.3_stable",
          "public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-load-tester-jmeter:v4.3.0"
         ]
        },
        {
         "Ref": "JMeterLoadTesterImageUri"
        }
       ]
      },
      "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-jmeter"
        ]
       ]
      },
      "StopTimeout": 120
     }
    ],
    "Cpu": "2048",
    "ExecutionRoleArn": {
     "Fn::GetAtt": [
      "DLTEcsDLTTaskExecutionRoleDE668717",
      "Arn"
     ]
    },
    "Family": "distributedloadtestingonawsDLTEcsJMeterDLTTaskDefinitionE45A23EF",
    "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.3.0/8d4f356d87f2b9f00dd4f83884fc3f1044a4981e198e9796b018259cfdf734db.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.3.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.3.0/121f71cba66471836aa189d539244f80a55ee44616628fee9e81f7519f2c671e.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.3.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.3.0/8fea2ed9822c44c7ef845113ab23292231c1b6ee76696978ff64c139a1bbad44.zip"
    },
    "Description": "Task runner for ECS task definitions",
    "Environment": {
     "Variables": {
      "SCENARIOS_BUCKET": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.3.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.3.0/9d4b8be619a7571c950827b1ce8cc6b3e43c5b012e0a80280278b0155cbcf58e.zip"
    },
    "Description": "Coordinates test cancellation — sets CANCELLING status, invokes test-cleanup per region",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.3.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.3.0/bc865b6364003d9701e33c29ff5aab0c0561e286efd964e7973207612b2fa045.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.3.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.3.0/42ffb393d418edee85506c84f539365861bbe514c1d5fdb0e32783865f6ea7bd.zip"
    },
    "Description": "Cleans up ECS resources for one region and sets final DDB status",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.3.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.3.0/0fb0d39ea250b3a88f5980e477e6e15a6c433ce91ec6d18496cfe2757459eba0.zip"
    },
    "Description": "Checks ECS service stabilization status",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.3.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.3.0/d9e8b6cdb35ca999803dd3db6b6b73fc0ef1babfb47e89b6dd3a7b3c34af07f5.zip"
    },
    "Description": "Writes S3 start marker so ECS tasks begin test execution",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.3.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.3.0/f51fd12bde397b8a929a51049c7d15ac2c53bb4fdcc67cc0c615aecdb922f706.zip"
    },
    "Description": "Validates all regions are READY and emits sync metric",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.3.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.3.0/1f308a0f7730e44ff3552f1a41261752b491b5ca21af970901d045fb2a57e357.zip"
    },
    "Description": "Handles ECS task failure events and tracks failure threshold",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.3.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"
     }
    ]
   }
  },
  "DLTLambdaFunctionECSTaskStoppedRuleAllowEventRuledistributedloadtestingonawsDLTLambdaFunctionTaskFailureHandlerDF4AC6853E5A05A6": {
   "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.3.0/c2463582fef47f44c245ea42c36b60d52bc77cd655c04a64f750afd3458bd0dc.zip"
    },
    "Description": "Hourly scan for orphaned ECS services not associated with active tests",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.3.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"
     }
    ]
   }
  },
  "DLTLambdaFunctionOrphanCleanupScheduleRuleAllowEventRuledistributedloadtestingonawsDLTLambdaFunctionOrphanCleanup6036DC73516CB1ED": {
   "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.3.0/ab91522c563e91fcc3bf763bb21ad4c75e857e96a60d6d51095164451a2da428.zip"
    },
    "Description": "Layer 2 safety: invokes test-cleanup when step function fails",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.3.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.3.0/556cc98a6d6f752156a6f8bf549cb7b2333a38b9e5de16f5a22624ecb821dd0f.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.3.0/9a4435bef3b1128de42f14d6e2b0095b6bf15cd6734c4702139e1ef356770d30.zip"
    },
    "Description": "Updates scenario and history DynamoDB records with current test status",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.3.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.3.0\",\"metricUrl\":\"https://metrics.awssolutionsbuilder.com/generic\",\"accountId\":\"",
       {
        "Ref": "AWS::AccountId"
       },
       "\",\"metricSchemaVersion\":1,\"data\":{\"Type\":\"TestStart\",\"TestId.$\":\"$.testId\",\"RunMode.$\":\"$.runMode\",\"TestType.$\":\"$.testType\",\"FileType.$\":\"$.fileType\",\"TestDuration.$\":\"$.testDuration\",\"RegionCount.$\":\"States.ArrayLength($.testTaskConfig)\"}}}},\"Stabilization Map\":{\"Type\":\"Map\",\"ResultPath\":\"$.stabilizationResults\",\"Next\":\"Init Error Reason\",\"InputPath\":\"$\",\"ItemsPath\":\"$.testTaskConfig\",\"ItemSelector\":{\"testTaskConfig.$\":\"$$.Map.Item.Value\",\"testId.$\":\"$.testId\",\"testType.$\":\"$.testType\",\"fileType.$\":\"$.fileType\",\"showLive.$\":\"$.showLive\",\"testDuration.$\":\"$.testDuration\",\"prefix.$\":\"$.prefix\",\"testRunId.$\":\"$.testRunId\",\"hubTaskDefinition.$\":\"$.hubTaskDefinition\",\"nativeTaskDefinitions.$\":\"$.nativeTaskDefinitions\",\"nativeRunMode.$\":\"$.nativeRunMode\"},\"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\":\"Task Runner failed?\",\"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.$\":\"$\"}},\"Task Runner failed?\":{\"Type\":\"Choice\",\"Choices\":[{\"And\":[{\"Variable\":\"$.status\",\"IsPresent\":true},{\"Variable\":\"$.status\",\"StringEquals\":\"FAILED\"}],\"Next\":\"Phase 1 Map End\"}],\"Default\":\"Check Stabilization\"},\"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\"}}}},\"Init Error Reason\":{\"Type\":\"Pass\",\"Result\":\"\",\"ResultPath\":\"$.errorReason\",\"Next\":\"Regional Sync\"},\"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\":\"Set Error Reason: regional sync error\"}],\"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\":\"Set Error Reason: stabilization failed\"},\"Set Error Reason: stabilization failed\":{\"Type\":\"Pass\",\"ResultPath\":\"$.errorReason\",\"InputPath\":\"$.syncResult.Payload.errorReason\",\"Next\":\"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.$\":\"$\"}}}}},\"Set Error Reason: regional sync error\":{\"Type\":\"Pass\",\"Result\":\"Regional sync failed — at least one region did not stabilize\",\"ResultPath\":\"$.errorReason\",\"Next\":\"Cancel All Regions\"},\"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.$\":\"$.errorReason\",\"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 Error Reason: results parsing failed\"}],\"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\",\"nativeRunMode.$\":\"$.nativeRunMode\",\"executionFailed.$\":\"$.executionResult.hasFailures\"}}},\"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\"}}},\"Set Error Reason: execution failed\":{\"Type\":\"Pass\",\"Result\":\"Test execution failed\",\"ResultPath\":\"$.errorReason\",\"Next\":\"Set Status: parsing results\"},\"Execution failed?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.executionResult.hasFailures\",\"BooleanEquals\":true,\"Next\":\"Set Error Reason: execution failed\"}],\"Default\":\"Set Status: parsing results\"},\"Check For Failures\":{\"Type\":\"Pass\",\"ResultPath\":\"$.executionResult\",\"Parameters\":{\"hasFailures.$\":\"States.ArrayContains($.executionMapResults, 'failed')\"},\"Next\":\"Execution failed?\"},\"Execution Map\":{\"Type\":\"Map\",\"ResultPath\":\"$.executionMapResults\",\"Next\":\"Check For Failures\",\"InputPath\":\"$\",\"ItemsPath\":\"$.stabilizationResults\",\"ItemProcessor\":{\"ProcessorConfig\":{\"Mode\":\"DISTRIBUTED\",\"ExecutionType\":\"STANDARD\"},\"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 - completion poll\":{\"Type\":\"Wait\",\"SecondsPath\":\"$.pollIntervalSeconds\",\"Next\":\"Check Completion\"},\"Is test complete?\":{\"Type\":\"Choice\",\"Choices\":[{\"And\":[{\"Variable\":\"$.isComplete\",\"BooleanEquals\":true},{\"Variable\":\"$.maxDurationReached\",\"BooleanEquals\":true}],\"Next\":\"Set Final Status: failed\"},{\"Variable\":\"$.isComplete\",\"BooleanEquals\":true,\"Next\":\"Set Final Status: success\"},{\"Variable\":\"$.timedOut\",\"BooleanEquals\":true,\"Next\":\"Prepare Phase 2 Failure Cleanup\"}],\"Default\":\"Wait - completion poll\"},\"Set Final Status: failed\":{\"Type\":\"Pass\",\"Parameters\":{\"finalStatus\":\"failed\"},\"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 Final Status: success\":{\"Type\":\"Pass\",\"Parameters\":{\"finalStatus\":\"success\"},\"Next\":\"Phase 2 Map End\"}}}},\"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\"}}},\"Set Error Reason: results parsing failed\":{\"Type\":\"Pass\",\"Result\":\"Results parsing failed\",\"ResultPath\":\"$.errorReason\",\"Next\":\"Set Status: cleaning up\"},\"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.3.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\",\"errorReason.$\":\"$.errorReason\"}}},\"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"
  },
  "DLTStepFunctionTaskRunnerStepFunctionsDistributedMapPolicyCCEB8A2C": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "states:StartExecution",
       "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::Select": [
            6,
            {
             "Fn::Split": [
              ":",
              {
               "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
              }
             ]
            }
           ]
          },
          ":*"
         ]
        ]
       }
      },
      {
       "Action": "states:RedriveExecution",
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":states:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":execution:",
          {
           "Fn::Select": [
            6,
            {
             "Fn::Split": [
              ":",
              {
               "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
              }
             ]
            }
           ]
          },
          "/*:*"
         ]
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTStepFunctionTaskRunnerStepFunctionsDistributedMapPolicyCCEB8A2C",
    "Roles": [
     {
      "Ref": "DLTStepFunctionTaskRunnerStepFunctionsRoleC2237F06"
     }
    ]
   }
  },
  "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"
     }
    ]
   }
  },
  "SFNFailureRuleAllowEventRuledistributedloadtestingonawsDLTLambdaFunctionSFNFailureHandlerDC8BE757C36A7BBD": {
   "Type": "AWS::Lambda::Permission",
   "Properties": {
    "Action": "lambda:InvokeFunction",
    "FunctionName": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionSFNFailureHandler928EB56D",
      "Arn"
     ]
    },
    "Principal": "events.amazonaws.com",
    "SourceArn": {
     "Fn::GetAtt": [
      "SFNFailureRule770B04D7",
      "Arn"
     ]
    }
   }
  },
  "DevOpsAgentDevOpsAgentRolePolicyA23FAEFA": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "aidevops:GetAgentSpace",
       "Condition": {
        "StringEquals": {
         "aws:ResourceTag/dlt-integration": "allowed"
        }
       },
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":aidevops:*:",
          {
           "Ref": "AWS::AccountId"
          },
          ":agentspace/*"
         ]
        ]
       }
      },
      {
       "Action": [
        "aidevops:CreateBacklogTask",
        "aidevops:GetBacklogTask",
        "aidevops:UpdateBacklogTask",
        "aidevops:ListExecutions",
        "aidevops:ListJournalRecords",
        "aidevops:CreateAsset",
        "aidevops:DeleteAsset"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":aidevops:*:",
          {
           "Ref": "AWS::AccountId"
          },
          ":agentspace/*"
         ]
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DevOpsAgentDevOpsAgentRolePolicyA23FAEFA",
    "Roles": [
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W12",
       "reason": "aidevops actions require wildcard on agentspace/* because Agent Space ARNs are customer-supplied at runtime. Access is scoped to the deploying account and by aws:ResourceTag condition requiring dlt-integration=allowed."
      }
     ]
    },
    "guard": {
     "SuppressedRules": [
      "IAM_POLICYDOCUMENT_NO_WILDCARD_RESOURCE"
     ]
    }
   }
  },
  "DevOpsAgentDLTAgentSpacesTable61D7EA45": {
   "Type": "AWS::DynamoDB::Table",
   "Properties": {
    "AttributeDefinitions": [
     {
      "AttributeName": "id",
      "AttributeType": "S"
     }
    ],
    "BillingMode": "PAY_PER_REQUEST",
    "KeySchema": [
     {
      "AttributeName": "id",
      "KeyType": "HASH"
     }
    ],
    "PointInTimeRecoverySpecification": {
     "PointInTimeRecoveryEnabled": true
    },
    "SSESpecification": {
     "SSEEnabled": true
    }
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "DYNAMODB_TABLE_ENCRYPTED_KMS"
     ]
    }
   }
  },
  "DevOpsAgentAgentSpacesDynamoDbPolicy527E48EB": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "dynamodb:GetItem",
        "dynamodb:BatchGetItem",
        "dynamodb:PutItem",
        "dynamodb:UpdateItem",
        "dynamodb:DeleteItem",
        "dynamodb:Scan"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DevOpsAgentDLTAgentSpacesTable61D7EA45",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DevOpsAgentAgentSpacesDynamoDbPolicy527E48EB",
    "Roles": [
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   }
  },
  "DevOpsAgentDLTInvestigationsTable7A3724B1": {
   "Type": "AWS::DynamoDB::Table",
   "Properties": {
    "AttributeDefinitions": [
     {
      "AttributeName": "testId",
      "AttributeType": "S"
     },
     {
      "AttributeName": "testRunId#investigationId",
      "AttributeType": "S"
     }
    ],
    "BillingMode": "PAY_PER_REQUEST",
    "KeySchema": [
     {
      "AttributeName": "testId",
      "KeyType": "HASH"
     },
     {
      "AttributeName": "testRunId#investigationId",
      "KeyType": "RANGE"
     }
    ],
    "PointInTimeRecoverySpecification": {
     "PointInTimeRecoveryEnabled": true
    },
    "SSESpecification": {
     "SSEEnabled": true
    }
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "DYNAMODB_TABLE_ENCRYPTED_KMS"
     ]
    }
   }
  },
  "DevOpsAgentInvestigationsDynamoDbPolicyD7D40D5F": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:UpdateItem",
        "dynamodb:DeleteItem",
        "dynamodb:Query"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DevOpsAgentDLTInvestigationsTable7A3724B1",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DevOpsAgentInvestigationsDynamoDbPolicyD7D40D5F",
    "Roles": [
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   }
  },
  "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.3.0/5cee860f09b277376b081d43e3e6b46890157886018fb598123e15921c52cd81.zip"
    },
    "Description": "API microservices for creating, updating, listing and deleting test scenarios",
    "Environment": {
     "Variables": {
      "AGENT_SPACES_TABLE": {
       "Ref": "DevOpsAgentDLTAgentSpacesTable61D7EA45"
      },
      "HISTORY_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC"
      },
      "HISTORY_TABLE_GSI_NAME": "testId-startTime-index",
      "INVESTIGATIONS_TABLE": {
       "Ref": "DevOpsAgentDLTInvestigationsTable7A3724B1"
      },
      "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.3.0",
      "MIN_COMPATIBLE_VERSION": "4.3.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.3.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"
  },
  "DLTApiDeployment098FF888e0fc41050c7fcd8230a1adf058b9f980": {
   "Type": "AWS::ApiGateway::Deployment",
   "Properties": {
    "Description": "Distributed Load Testing API - version v4.3.0",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   },
   "DependsOn": [
    "DLTApiAPIAllRequestValidator02C9D47F",
    "DLTApiagentspacesidDELETEE53AA4B1",
    "DLTApiagentspacesidOPTIONS6F645723",
    "DLTApiagentspacesidPUT3DEFAE4B",
    "DLTApiagentspacesid62BB6E49",
    "DLTApiagentspacesGETB8ECC745",
    "DLTApiagentspacesOPTIONSA4FED97E",
    "DLTApiagentspacesPOSTD1A52DEF",
    "DLTApiagentspacesD37E2504",
    "DLTApiagentspacestestconnectionOPTIONSD11D7C8B",
    "DLTApiagentspacestestconnectionPOSTBA655A13",
    "DLTApiagentspacestestconnection2A2E23CF",
    "DLTApiOPTIONS823B5F09",
    "DLTApiregionsANY2B8B3A61",
    "DLTApiregionsOPTIONSCB04B2B1",
    "DLTApiregionsC4EF9783",
    "DLTApiscenariostestIdANY993028D3",
    "DLTApiscenariostestIdbaselineDELETEF89F45B6",
    "DLTApiscenariostestIdbaselineGETEBD92F32",
    "DLTApiscenariostestIdbaselineOPTIONS18BF10ED",
    "DLTApiscenariostestIdbaselinePUT9B6A0CA8",
    "DLTApiscenariostestIdbaseline90D9E1E4",
    "DLTApiscenariostestIdOPTIONS0B339CE6",
    "DLTApiscenariostestId4C170989",
    "DLTApiscenariostestIdtestrunstestRunIdANYD6143F4D",
    "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdDELETEAA482AB3",
    "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdfindingsGET772FB1BF",
    "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdfindingsOPTIONSAA8BDD23",
    "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdfindings18A5C30C",
    "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdOPTIONS9308E822",
    "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdPUTC8415E02",
    "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdB3762A5C",
    "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdstatusGET471BE1D2",
    "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdstatusOPTIONS7466A154",
    "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdstatus7F1C0A0C",
    "DLTApiscenariostestIdtestrunstestRunIdinvestigationsGET34F1B8C0",
    "DLTApiscenariostestIdtestrunstestRunIdinvestigationsOPTIONSAC5FEC07",
    "DLTApiscenariostestIdtestrunstestRunIdinvestigationsPOST23361011",
    "DLTApiscenariostestIdtestrunstestRunIdinvestigations1FDDBF34",
    "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": "DLTApiDeployment098FF888e0fc41050c7fcd8230a1adf058b9f980"
    },
    "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"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdinvestigations1FDDBF34": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Ref": "DLTApiscenariostestIdtestrunstestRunIdFE2B5E0B"
    },
    "PathPart": "investigations",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdinvestigationsOPTIONSAC5FEC07": {
   "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": "DLTApiscenariostestIdtestrunstestRunIdinvestigations1FDDBF34"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdinvestigationsGET34F1B8C0": {
   "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": "DLTApiscenariostestIdtestrunstestRunIdinvestigations1FDDBF34"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdinvestigationsPOST23361011": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "POST",
    "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": "DLTApiscenariostestIdtestrunstestRunIdinvestigations1FDDBF34"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdB3762A5C": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Ref": "DLTApiscenariostestIdtestrunstestRunIdinvestigations1FDDBF34"
    },
    "PathPart": "{investigationId}",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdOPTIONS9308E822": {
   "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": "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdB3762A5C"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdPUTC8415E02": {
   "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": "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdB3762A5C"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdDELETEAA482AB3": {
   "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": "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdB3762A5C"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdstatus7F1C0A0C": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Ref": "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdB3762A5C"
    },
    "PathPart": "status",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdstatusOPTIONS7466A154": {
   "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": "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdstatus7F1C0A0C"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdstatusGET471BE1D2": {
   "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": "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdstatus7F1C0A0C"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdfindings18A5C30C": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Ref": "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdB3762A5C"
    },
    "PathPart": "findings",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdfindingsOPTIONSAA8BDD23": {
   "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": "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdfindings18A5C30C"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdfindingsGET772FB1BF": {
   "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": "DLTApiscenariostestIdtestrunstestRunIdinvestigationsinvestigationIdfindings18A5C30C"
    },
    "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"
    }
   }
  },
  "DLTApiagentspacesD37E2504": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Fn::GetAtt": [
      "DLTApi0C903EB5",
      "RootResourceId"
     ]
    },
    "PathPart": "agent-spaces",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiagentspacesOPTIONSA4FED97E": {
   "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": "DLTApiagentspacesD37E2504"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiagentspacesGETB8ECC745": {
   "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": "DLTApiagentspacesD37E2504"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiagentspacesPOSTD1A52DEF": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "POST",
    "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": "DLTApiagentspacesD37E2504"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiagentspacesid62BB6E49": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Ref": "DLTApiagentspacesD37E2504"
    },
    "PathPart": "{id}",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiagentspacesidOPTIONS6F645723": {
   "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": "DLTApiagentspacesid62BB6E49"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiagentspacesidPUT3DEFAE4B": {
   "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": "DLTApiagentspacesid62BB6E49"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiagentspacesidDELETEE53AA4B1": {
   "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": "DLTApiagentspacesid62BB6E49"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiagentspacestestconnection2A2E23CF": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Ref": "DLTApiagentspacesD37E2504"
    },
    "PathPart": "test-connection",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiagentspacestestconnectionOPTIONSD11D7C8B": {
   "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": "DLTApiagentspacestestconnection2A2E23CF"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiagentspacestestconnectionPOSTBA655A13": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "POST",
    "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": "DLTApiagentspacestestconnection2A2E23CF"
    },
    "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://",
         {
          "Fn::GetAtt": [
           "DLTConsoleResourcesDLTDashboardS3CloudFrontDistribution1F11B8BB",
           "DomainName"
          ]
         },
         "/</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://",
        {
         "Fn::GetAtt": [
          "DLTConsoleResourcesDLTDashboardS3CloudFrontDistribution1F11B8BB",
          "DomainName"
         ]
        }
       ]
      ]
     },
     {
      "Fn::Join": [
       "",
       [
        "https://",
        {
         "Fn::GetAtt": [
          "DLTConsoleResourcesDLTDashboardS3CloudFrontDistribution1F11B8BB",
          "DomainName"
         ]
        },
        "/"
       ]
      ]
     },
     "http://localhost:3000",
     "http://localhost:3000/",
     "http://localhost:3000/callback",
     "http://localhost:7521/callback",
     "http://localhost:7521",
     "http://127.0.0.1:7521",
     "cursor://anysphere.cursor-mcp/oauth/callback"
    ],
    "ClientName": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-userpool-client"
      ]
     ]
    },
    "EnableTokenRevocation": true,
    "ExplicitAuthFlows": [
     "ALLOW_USER_SRP_AUTH"
    ],
    "GenerateSecret": false,
    "LogoutURLs": [
     {
      "Fn::Join": [
       "",
       [
        "https://",
        {
         "Fn::GetAtt": [
          "DLTConsoleResourcesDLTDashboardS3CloudFrontDistribution1F11B8BB",
          "DomainName"
         ]
        }
       ]
      ]
     },
     {
      "Fn::Join": [
       "",
       [
        "https://",
        {
         "Fn::GetAtt": [
          "DLTConsoleResourcesDLTDashboardS3CloudFrontDistribution1F11B8BB",
          "DomainName"
         ]
        },
        "/"
       ]
      ]
     },
     "http://localhost:3000",
     "http://localhost:3000/",
     "http://localhost:3000/callback",
     "http://localhost:7521/callback",
     "http://localhost:7521",
     "http://127.0.0.1:7521",
     "cursor://anysphere.cursor-mcp/oauth/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.3.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.3.0/e16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63.zip"
    },
    "Description": "AWS CDK resource provider framework - onEvent (distributed-load-testing-on-aws/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": "nodejs24.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": [
          "DLTConsoleResourcesDLTDashboardS3S3Bucket8E2568BB",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTConsoleResourcesDLTDashboardS3S3Bucket8E2568BB",
             "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.3.0/b5727d26ec673e86e4c15543e1745533e8239b31a9f0fd5448a514b98d572afa.zip"
    },
    "Handler": "index.handler",
    "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.3.0/e16ffb3b34af185b8b30c88fdb19faa13b6c42bb38580485c4e84b384ee48b63.zip"
    },
    "Description": "AWS CDK resource provider framework - onEvent (distributed-load-testing-on-aws/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": "nodejs24.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"
    },
    "BucketName": {
     "Ref": "DLTConsoleResourcesDLTDashboardS3S3Bucket8E2568BB"
    },
    "ObjectKey": "aws-exports.json"
   },
   "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"
  },
  "MCPServerMCPWritePolicyEE2F4EFA": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "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"
           },
           "/*/POST/*"
          ]
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":execute-api:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":",
           {
            "Ref": "DLTApi0C903EB5"
           },
           "/*/PUT/*"
          ]
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":execute-api:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":",
           {
            "Ref": "DLTApi0C903EB5"
           },
           "/*/DELETE/*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "s3:PutObject",
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":s3:::",
          {
           "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
          },
          "/public/test-scenarios/*"
         ]
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "MCPServerMCPWritePolicyEE2F4EFA",
    "Roles": [
     {
      "Ref": "MCPServerMCPToolLambdaRole83B130EC"
     }
    ]
   },
   "Condition": "DeployMCPServerAndIsReadWriteCondition"
  },
  "MCPServerMCPToolLambdaFunctionA0B6CA8F": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.3.0/554d0f45684d639313facc05c0bb2571748e14ac7982450f9ac47c236f8e9b03.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.3.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": {
         "Fn::If": [
          "MCPServerIsReadWriteCondition7036A529",
          [
           {
            "Name": "list_scenarios",
            "Description": "Retrieve a list of all available test scenarios",
            "InputSchema": {
             "Required": [],
             "Type": "object"
            }
           },
           {
            "Name": "get_scenario_details",
            "Description": "Retrieve the test configuration and most recent test run for a single test scenario. The response reports the scenario's traffic-shape mode: a nativeRunMode object means Native, where the uploaded script owns the load and each task runs a full copy of it, and its absence means Standard, where the stored concurrency, ramp-up, and hold-for values are the load. For a Native scenario the stored concurrency, ramp-up, and hold-for values were never applied, so do not report them as the load and do not reuse them when composing an update.",
            "InputSchema": {
             "Properties": {
              "test_id": {
               "Description": "The test scenario's unique identifier",
               "Type": "string"
              }
             },
             "Required": [
              "test_id"
             ],
             "Type": "object"
            }
           },
           {
            "Name": "list_test_runs",
            "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": "get_test_run",
            "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_latest_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_baseline_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_test_run_artifacts",
            "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": "create_test",
            "Description": "Create a new load test scenario without executing it. The test is saved and can be run later with start_run. Requires the full test configuration including test type, scenario definition, and regional task configuration. Returns the created test object including its test ID for use in subsequent operations. For simple HTTP tests, omit test_id and the system will generate one. For script-based tests (jmeter, k6, locust), you must call upload_test_script first, then pass the test_id returned by upload_test_script to link the scenario with the uploaded script. Use update_test to modify an existing test.",
            "InputSchema": {
             "Type": "object",
             "Required": [
              "test_name",
              "test_description",
              "test_type",
              "test_task_configs",
              "test_scenario"
             ],
             "Properties": {
              "test_id": {
               "Type": "string",
               "Description": "The test scenario's unique identifier. Omit for simple HTTP tests (system will generate one). Required for script-based tests — use the test_id returned by upload_test_script to associate the scenario with the uploaded script file."
              },
              "test_name": {
               "Type": "string",
               "Description": "Human-readable name for the test scenario"
              },
              "test_description": {
               "Type": "string",
               "Description": "Description of what this test validates"
              },
              "test_type": {
               "Type": "string",
               "Description": "Test type. 'simple' for HTTP endpoint tests configured inline. 'jmeter', 'k6', or 'locust' for script-based tests that reference an uploaded script file."
              },
              "test_task_configs": {
               "Type": "array",
               "Description": "Regional task configuration. Each entry specifies a region and the number of Fargate tasks and concurrent virtual users to run there. Total concurrent users for a region = task_count × concurrency (e.g., task_count: 5, concurrency: 20 = 100 total concurrent users in that region).",
               "Items": {
                "Type": "object",
                "Required": [
                 "region",
                 "task_count",
                 "concurrency"
                ],
                "Properties": {
                 "region": {
                  "Type": "string",
                  "Description": "AWS region to run tasks in (e.g., 'us-east-1'). Must have a deployed DLT regional stack."
                 },
                 "task_count": {
                  "Type": "integer",
                  "Description": "Number of Fargate tasks to launch in this region. Must be between 1 and the region's available task limit."
                 },
                 "concurrency": {
                  "Type": "integer",
                  "Description": "Standard mode: number of concurrent virtual users per task in this region. Ignored in Native mode, where the uploaded script sets the virtual users."
                 }
                }
               }
              },
              "test_scenario": {
               "Type": "object",
               "Description": "Test execution scenario defining the load profile and target endpoint(s).",
               "Required": [
                "execution",
                "scenarios"
               ],
               "Properties": {
                "execution": {
                 "Type": "array",
                 "Description": "Standard mode execution configuration. Typically a single entry defining ramp-up, hold-for duration, and which scenario to use. Native mode ignores ramp-up and hold-for, because the uploaded script owns the load shape.",
                 "Items": {
                  "Type": "object",
                  "Required": [
                   "ramp-up",
                   "hold-for",
                   "scenario"
                  ],
                  "Properties": {
                   "ramp-up": {
                    "Type": "string",
                    "Description": "Standard mode: time to ramp up to full concurrency, ignored in Native mode. Format: number followed by unit ('s' for seconds, 'm' for minutes). Example: '30s', '2m'."
                   },
                   "hold-for": {
                    "Type": "string",
                    "Description": "Standard mode: duration to maintain full concurrency after ramp-up, ignored in Native mode. Format: number followed by unit ('s' for seconds, 'm' for minutes). Must be at least 1 second. Example: '5m', '300s'."
                   },
                   "scenario": {
                    "Type": "string",
                    "Description": "Name of the scenario definition in the 'scenarios' object to execute."
                   }
                  }
                 }
                },
                "scenarios": {
                 "Type": "object",
                 "Description": "Named scenario definitions. For simple tests, each scenario has a 'requests' array of HTTP requests. For script tests, each scenario has a 'script' string referencing the uploaded file path."
                }
               }
              },
              "show_live": {
               "Type": "boolean",
               "Description": "Whether to enable live monitoring during test execution. Default: false."
              },
              "tags": {
               "Type": "array",
               "Description": "Tags for organizing test scenarios. Maximum 5 tags. Each tag must be lowercase alphanumeric with hyphens only, max 50 characters.",
               "Items": {
                "Type": "string"
               }
              },
              "healthy_threshold": {
               "Type": "integer",
               "Description": "Minimum percentage of Fargate tasks that must remain healthy (not crash) during test execution. If the healthy task percentage drops below this threshold, the test is marked as failed early. Default: 90."
              },
              "native_run_mode": {
               "Type": "object",
               "Description": "Traffic shape. Omit this object for Standard mode; include it to select Native mode. Only script-based tests (jmeter, k6, locust) support Native; Simple HTTP Endpoint tests always use Standard.\n\nStandard. Standard mode puts DLT in control of the load. You set the Fargate task count per Region, the concurrent virtual users per task, a ramp-up period, and a hold duration, and DLT runs the test through the Taurus automation framework, which applies those values over whatever load your script declares. A Region's virtual users are the task count multiplied by the per-task concurrency. Standard is the only mode that lets you set an exact virtual-user count and change the ramp-up and hold shape without editing the script, and the only one that supports the Simple HTTP Endpoint type. Its limit is expressiveness: anything Taurus cannot represent, such as weighted scenarios, per-stage thresholds, or arrival-rate executors, is unavailable. This is how every DLT test ran before v4.3.0, so existing scenarios keep behaving exactly as they did.\n\nNative. Native mode puts your script in control of the load. DLT runs the file you uploaded under the framework's own command line and passes no load flags, so your script is the sole authority on the traffic it generates. Two controls remain: how many Fargate tasks to launch per Region, and a required safety duration of up to 24 hours. The safety duration guards against a script that never exits rather than scheduling the run: if the test is still going when it elapses, DLT stops the framework, keeps the results for the portion that ran, and records the run as completed. Tasks are uncoordinated and each runs a full copy of the script, so a k6 script holding 200 virtual users on five tasks puts 1,000 virtual users on the target. Task count is therefore the only load dial; changing the ramp, the hold time, or the virtual-user count means editing the script. Native requires an uploaded script, so Simple HTTP Endpoint is unavailable, and Locust scripts must not set processes.",
               "Required": [
                "maxTestDurationSeconds"
               ],
               "Properties": {
                "maxTestDurationSeconds": {
                 "Type": "integer",
                 "Description": "Native mode safety timeout in seconds, required whenever native_run_mode is present. It guards against a script that never exits rather than scheduling the run: if the test is still running when the timeout elapses, DLT stops the framework, collects the results for the portion that ran, and records the run as completed rather than failed. Must be between 1 and 86400 (24 hours)."
                }
               }
              }
             }
            }
           },
           {
            "Name": "update_test",
            "Description": "Update an existing test scenario. This is a full replace — the entire test configuration must be provided, not just the changed fields. The test must be in a non-running state (complete, cancelled, failed, scheduled, or created). Use get_scenario_details to retrieve the current configuration before updating. Cannot be used while the test is running.",
            "InputSchema": {
             "Type": "object",
             "Required": [
              "test_id",
              "test_name",
              "test_description",
              "test_type",
              "test_task_configs",
              "test_scenario"
             ],
             "Properties": {
              "test_id": {
               "Type": "string",
               "Description": "The test scenario's unique identifier. Must reference an existing test."
              },
              "test_name": {
               "Type": "string",
               "Description": "Human-readable name for the test scenario"
              },
              "test_description": {
               "Type": "string",
               "Description": "Description of what this test validates"
              },
              "test_type": {
               "Type": "string",
               "Description": "Test type. 'simple' for HTTP endpoint tests. 'jmeter', 'k6', or 'locust' for script-based tests."
              },
              "test_task_configs": {
               "Type": "array",
               "Description": "Regional task configuration.",
               "Items": {
                "Type": "object",
                "Required": [
                 "region",
                 "task_count",
                 "concurrency"
                ],
                "Properties": {
                 "region": {
                  "Type": "string",
                  "Description": "AWS region to run tasks in (e.g., 'us-east-1')"
                 },
                 "task_count": {
                  "Type": "integer",
                  "Description": "Number of Fargate tasks to launch in this region."
                 },
                 "concurrency": {
                  "Type": "integer",
                  "Description": "Standard mode: number of concurrent virtual users per task. Ignored in Native mode."
                 }
                }
               }
              },
              "test_scenario": {
               "Type": "object",
               "Description": "Test execution scenario. Same structure as create_test.",
               "Required": [
                "execution",
                "scenarios"
               ],
               "Properties": {
                "execution": {
                 "Type": "array",
                 "Items": {
                  "Type": "object",
                  "Required": [
                   "ramp-up",
                   "hold-for",
                   "scenario"
                  ],
                  "Properties": {
                   "ramp-up": {
                    "Type": "string",
                    "Description": "Standard mode: ramp-up time (e.g., '30s', '2m'). Ignored in Native mode"
                   },
                   "hold-for": {
                    "Type": "string",
                    "Description": "Standard mode: hold duration (e.g., '5m', '300s'). Ignored in Native mode"
                   },
                   "scenario": {
                    "Type": "string",
                    "Description": "Scenario name to execute"
                   }
                  }
                 }
                },
                "scenarios": {
                 "Type": "object",
                 "Description": "Named scenario definitions."
                }
               }
              },
              "show_live": {
               "Type": "boolean",
               "Description": "Whether to enable live monitoring. Default: false."
              },
              "tags": {
               "Type": "array",
               "Description": "Tags. Maximum 5.",
               "Items": {
                "Type": "string"
               }
              },
              "healthy_threshold": {
               "Type": "integer",
               "Description": "Minimum percentage of Fargate tasks that must remain healthy during execution. Default: 90."
              },
              "native_run_mode": {
               "Type": "object",
               "Description": "Traffic shape. Omit this object for Standard mode; include it to select Native mode. Only script-based tests (jmeter, k6, locust) support Native; Simple HTTP Endpoint tests always use Standard.\n\nStandard. Standard mode puts DLT in control of the load. You set the Fargate task count per Region, the concurrent virtual users per task, a ramp-up period, and a hold duration, and DLT runs the test through the Taurus automation framework, which applies those values over whatever load your script declares. A Region's virtual users are the task count multiplied by the per-task concurrency. Standard is the only mode that lets you set an exact virtual-user count and change the ramp-up and hold shape without editing the script, and the only one that supports the Simple HTTP Endpoint type. Its limit is expressiveness: anything Taurus cannot represent, such as weighted scenarios, per-stage thresholds, or arrival-rate executors, is unavailable. This is how every DLT test ran before v4.3.0, so existing scenarios keep behaving exactly as they did.\n\nNative. Native mode puts your script in control of the load. DLT runs the file you uploaded under the framework's own command line and passes no load flags, so your script is the sole authority on the traffic it generates. Two controls remain: how many Fargate tasks to launch per Region, and a required safety duration of up to 24 hours. The safety duration guards against a script that never exits rather than scheduling the run: if the test is still going when it elapses, DLT stops the framework, keeps the results for the portion that ran, and records the run as completed. Tasks are uncoordinated and each runs a full copy of the script, so a k6 script holding 200 virtual users on five tasks puts 1,000 virtual users on the target. Task count is therefore the only load dial; changing the ramp, the hold time, or the virtual-user count means editing the script. Native requires an uploaded script, so Simple HTTP Endpoint is unavailable, and Locust scripts must not set processes.",
               "Required": [
                "maxTestDurationSeconds"
               ],
               "Properties": {
                "maxTestDurationSeconds": {
                 "Type": "integer",
                 "Description": "Native mode safety timeout in seconds, required whenever native_run_mode is present. It guards against a script that never exits rather than scheduling the run: if the test is still running when the timeout elapses, DLT stops the framework, collects the results for the portion that ran, and records the run as completed rather than failed. Must be between 1 and 86400 (24 hours)."
                }
               }
              }
             }
            }
           },
           {
            "Name": "delete_test",
            "Description": "Permanently delete a test scenario and all associated data including test run history, schedules, and CloudWatch dashboards. This action cannot be undone. The test must not be currently running.",
            "InputSchema": {
             "Type": "object",
             "Required": [
              "test_id"
             ],
             "Properties": {
              "test_id": {
               "Type": "string",
               "Description": "The test scenario's unique identifier"
              }
             }
            }
           },
           {
            "Name": "start_run",
            "Description": "Start execution of an existing test scenario. Launches Fargate tasks in the configured regions and begins generating load against the target endpoint(s). The test's stored configuration is used — no need to provide the full config. Returns immediately with the test status set to 'queued'. Use get_latest_test_run to poll for completion — the run progresses through statuses: queued → running → complete (or failed/cancelled).",
            "InputSchema": {
             "Type": "object",
             "Required": [
              "test_id"
             ],
             "Properties": {
              "test_id": {
               "Type": "string",
               "Description": "The test scenario's unique identifier. The test must already exist (created via create_test) and must not be currently running."
              }
             }
            }
           },
           {
            "Name": "stop_run",
            "Description": "Stop a currently running test. Sends a cancellation signal to all running Fargate tasks. The test status will transition to 'cancelled'. Partial results up to the point of cancellation will be available via get_latest_test_run.",
            "InputSchema": {
             "Type": "object",
             "Required": [
              "test_id"
             ],
             "Properties": {
              "test_id": {
               "Type": "string",
               "Description": "The test scenario's unique identifier"
              }
             }
            }
           },
           {
            "Name": "create_simple_schedule",
            "Description": "Create a one-time scheduled test that runs automatically at a specified date and time. Can create a new scheduled test from scratch (omit test_id) or add a schedule to an existing unscheduled test (pass the existing test_id). Requires all standard test configuration fields plus schedule_date and schedule_time. The schedule is managed via EventBridge Scheduler. For new simple HTTP tests, omit test_id and the system will generate one. For script-based tests, you must call upload_test_script first and pass the returned test_id. For existing tests, pass the test_id and the full test configuration (retrieve with get_scenario_details first).",
            "InputSchema": {
             "Type": "object",
             "Required": [
              "test_name",
              "test_description",
              "test_type",
              "test_task_configs",
              "test_scenario",
              "schedule_date",
              "schedule_time"
             ],
             "Properties": {
              "test_id": {
               "Type": "string",
               "Description": "The test scenario's unique identifier. Omit for new simple HTTP tests (system will generate one). Required for script-based tests (use the test_id returned by upload_test_script). Pass an existing test_id to add a schedule to an existing unscheduled test."
              },
              "test_name": {
               "Type": "string",
               "Description": "Human-readable name for the test scenario"
              },
              "test_description": {
               "Type": "string",
               "Description": "Description of what this test validates"
              },
              "test_type": {
               "Type": "string",
               "Description": "Test type"
              },
              "test_task_configs": {
               "Type": "array",
               "Description": "Regional task configuration",
               "Items": {
                "Type": "object",
                "Required": [
                 "region",
                 "task_count",
                 "concurrency"
                ],
                "Properties": {
                 "region": {
                  "Type": "string",
                  "Description": "AWS region (e.g., 'us-east-1')"
                 },
                 "task_count": {
                  "Type": "integer",
                  "Description": "Number of Fargate tasks to launch in this region."
                 },
                 "concurrency": {
                  "Type": "integer",
                  "Description": "Standard mode: number of concurrent virtual users per task. Ignored in Native mode."
                 }
                }
               }
              },
              "test_scenario": {
               "Type": "object",
               "Description": "Test execution scenario. Same structure as create_test.",
               "Required": [
                "execution",
                "scenarios"
               ]
              },
              "schedule_date": {
               "Type": "string",
               "Description": "Date for the scheduled run. Format: YYYY-MM-DD. Must be in the future."
              },
              "schedule_time": {
               "Type": "string",
               "Description": "Time for the scheduled run. Format: HH:MM (24-hour). Must be in the future when combined with schedule_date."
              },
              "schedule_timezone": {
               "Type": "string",
               "Description": "IANA timezone for schedule interpretation (e.g., 'America/New_York', 'UTC'). Default: 'UTC'."
              },
              "show_live": {
               "Type": "boolean",
               "Description": "Enable live monitoring. Default: false."
              },
              "tags": {
               "Type": "array",
               "Items": {
                "Type": "string"
               }
              },
              "healthy_threshold": {
               "Type": "integer"
              },
              "native_run_mode": {
               "Type": "object",
               "Description": "Traffic shape. Omit this object for Standard mode; include it to select Native mode. Only script-based tests (jmeter, k6, locust) support Native; Simple HTTP Endpoint tests always use Standard.\n\nStandard. Standard mode puts DLT in control of the load. You set the Fargate task count per Region, the concurrent virtual users per task, a ramp-up period, and a hold duration, and DLT runs the test through the Taurus automation framework, which applies those values over whatever load your script declares. A Region's virtual users are the task count multiplied by the per-task concurrency. Standard is the only mode that lets you set an exact virtual-user count and change the ramp-up and hold shape without editing the script, and the only one that supports the Simple HTTP Endpoint type. Its limit is expressiveness: anything Taurus cannot represent, such as weighted scenarios, per-stage thresholds, or arrival-rate executors, is unavailable. This is how every DLT test ran before v4.3.0, so existing scenarios keep behaving exactly as they did.\n\nNative. Native mode puts your script in control of the load. DLT runs the file you uploaded under the framework's own command line and passes no load flags, so your script is the sole authority on the traffic it generates. Two controls remain: how many Fargate tasks to launch per Region, and a required safety duration of up to 24 hours. The safety duration guards against a script that never exits rather than scheduling the run: if the test is still going when it elapses, DLT stops the framework, keeps the results for the portion that ran, and records the run as completed. Tasks are uncoordinated and each runs a full copy of the script, so a k6 script holding 200 virtual users on five tasks puts 1,000 virtual users on the target. Task count is therefore the only load dial; changing the ramp, the hold time, or the virtual-user count means editing the script. Native requires an uploaded script, so Simple HTTP Endpoint is unavailable, and Locust scripts must not set processes.",
               "Required": [
                "maxTestDurationSeconds"
               ],
               "Properties": {
                "maxTestDurationSeconds": {
                 "Type": "integer",
                 "Description": "Native mode safety timeout in seconds, required whenever native_run_mode is present. It guards against a script that never exits rather than scheduling the run: if the test is still running when the timeout elapses, DLT stops the framework, collects the results for the portion that ran, and records the run as completed rather than failed. Must be between 1 and 86400 (24 hours)."
                }
               }
              }
             }
            }
           },
           {
            "Name": "create_cron_schedule",
            "Description": "Create a recurring scheduled test that runs automatically on a cron schedule. Can create a new scheduled test from scratch (omit test_id) or add a schedule to an existing unscheduled test (pass the existing test_id). Requires all standard test configuration fields plus cron_value and recurrence. The schedule is managed via EventBridge Scheduler. For new simple HTTP tests, omit test_id and the system will generate one. For script-based tests, you must call upload_test_script first and pass the returned test_id. For existing tests, pass the test_id and the full test configuration (retrieve with get_scenario_details first).",
            "InputSchema": {
             "Type": "object",
             "Required": [
              "test_name",
              "test_description",
              "test_type",
              "test_task_configs",
              "test_scenario",
              "cron_value",
              "recurrence"
             ],
             "Properties": {
              "test_id": {
               "Type": "string",
               "Description": "The test scenario's unique identifier. Omit for new simple HTTP tests (system will generate one). Required for script-based tests (use the test_id returned by upload_test_script). Pass an existing test_id to add a schedule to an existing unscheduled test."
              },
              "test_name": {
               "Type": "string",
               "Description": "Human-readable name for the test scenario"
              },
              "test_description": {
               "Type": "string",
               "Description": "Description of what this test validates"
              },
              "test_type": {
               "Type": "string",
               "Description": "Test type"
              },
              "test_task_configs": {
               "Type": "array",
               "Description": "Regional task configuration",
               "Items": {
                "Type": "object",
                "Required": [
                 "region",
                 "task_count",
                 "concurrency"
                ],
                "Properties": {
                 "region": {
                  "Type": "string",
                  "Description": "AWS region (e.g., 'us-east-1')"
                 },
                 "task_count": {
                  "Type": "integer",
                  "Description": "Number of Fargate tasks to launch in this region."
                 },
                 "concurrency": {
                  "Type": "integer",
                  "Description": "Standard mode: number of concurrent virtual users per task. Ignored in Native mode."
                 }
                }
               }
              },
              "test_scenario": {
               "Type": "object",
               "Description": "Test execution scenario. Same structure as create_test.",
               "Required": [
                "execution",
                "scenarios"
               ]
              },
              "cron_value": {
               "Type": "string",
               "Description": "Cron expression for the recurring schedule. Standard 5-field cron format. Must specify exactly one minute value (e.g., '0 9 * * *' for daily at 9am — not '*/30 * * * *'). Minimum interval between executions is 1 hour, and must be long enough for the test to complete before the next run starts."
              },
              "recurrence": {
               "Type": "string",
               "Description": "Human-readable recurrence label (e.g., 'daily', 'weekly'). Used for display purposes."
              },
              "cron_expiry_date": {
               "Type": "string",
               "Description": "Date when the recurring schedule expires and stops executing. Format: YYYY-MM-DD. Must be after the next scheduled run date. Optional — if omitted, the schedule runs indefinitely."
              },
              "schedule_timezone": {
               "Type": "string",
               "Description": "IANA timezone for schedule interpretation (e.g., 'America/New_York', 'UTC'). Default: 'UTC'."
              },
              "show_live": {
               "Type": "boolean",
               "Description": "Enable live monitoring. Default: false."
              },
              "tags": {
               "Type": "array",
               "Items": {
                "Type": "string"
               }
              },
              "healthy_threshold": {
               "Type": "integer"
              },
              "native_run_mode": {
               "Type": "object",
               "Description": "Traffic shape. Omit this object for Standard mode; include it to select Native mode. Only script-based tests (jmeter, k6, locust) support Native; Simple HTTP Endpoint tests always use Standard.\n\nStandard. Standard mode puts DLT in control of the load. You set the Fargate task count per Region, the concurrent virtual users per task, a ramp-up period, and a hold duration, and DLT runs the test through the Taurus automation framework, which applies those values over whatever load your script declares. A Region's virtual users are the task count multiplied by the per-task concurrency. Standard is the only mode that lets you set an exact virtual-user count and change the ramp-up and hold shape without editing the script, and the only one that supports the Simple HTTP Endpoint type. Its limit is expressiveness: anything Taurus cannot represent, such as weighted scenarios, per-stage thresholds, or arrival-rate executors, is unavailable. This is how every DLT test ran before v4.3.0, so existing scenarios keep behaving exactly as they did.\n\nNative. Native mode puts your script in control of the load. DLT runs the file you uploaded under the framework's own command line and passes no load flags, so your script is the sole authority on the traffic it generates. Two controls remain: how many Fargate tasks to launch per Region, and a required safety duration of up to 24 hours. The safety duration guards against a script that never exits rather than scheduling the run: if the test is still going when it elapses, DLT stops the framework, keeps the results for the portion that ran, and records the run as completed. Tasks are uncoordinated and each runs a full copy of the script, so a k6 script holding 200 virtual users on five tasks puts 1,000 virtual users on the target. Task count is therefore the only load dial; changing the ramp, the hold time, or the virtual-user count means editing the script. Native requires an uploaded script, so Simple HTTP Endpoint is unavailable, and Locust scripts must not set processes.",
               "Required": [
                "maxTestDurationSeconds"
               ],
               "Properties": {
                "maxTestDurationSeconds": {
                 "Type": "integer",
                 "Description": "Native mode safety timeout in seconds, required whenever native_run_mode is present. It guards against a script that never exits rather than scheduling the run: if the test is still running when the timeout elapses, DLT stops the framework, collects the results for the portion that ran, and records the run as completed rather than failed. Must be between 1 and 86400 (24 hours)."
                }
               }
              }
             }
            }
           },
           {
            "Name": "update_simple_schedule",
            "Description": "Update the configuration for an existing one-time scheduled test. This is a full replace of the test configuration including schedule fields — retrieve the current configuration with get_scenario_details first, modify the fields, and submit the complete configuration. The test must already be in 'scheduled' status.",
            "InputSchema": {
             "Type": "object",
             "Required": [
              "test_id",
              "test_name",
              "test_description",
              "test_type",
              "test_task_configs",
              "test_scenario",
              "schedule_date",
              "schedule_time"
             ],
             "Properties": {
              "test_id": {
               "Type": "string",
               "Description": "The existing test scenario's unique identifier"
              },
              "test_name": {
               "Type": "string",
               "Description": "Human-readable name for the test scenario"
              },
              "test_description": {
               "Type": "string",
               "Description": "Description of what this test validates"
              },
              "test_type": {
               "Type": "string",
               "Description": "Test type"
              },
              "test_task_configs": {
               "Type": "array",
               "Items": {
                "Type": "object",
                "Required": [
                 "region",
                 "task_count",
                 "concurrency"
                ],
                "Properties": {
                 "region": {
                  "Type": "string"
                 },
                 "task_count": {
                  "Type": "integer"
                 },
                 "concurrency": {
                  "Type": "integer"
                 }
                }
               }
              },
              "test_scenario": {
               "Type": "object",
               "Required": [
                "execution",
                "scenarios"
               ]
              },
              "schedule_date": {
               "Type": "string",
               "Description": "Date for the scheduled run. Format: YYYY-MM-DD. Must be in the future."
              },
              "schedule_time": {
               "Type": "string",
               "Description": "Time for the scheduled run. Format: HH:MM (24-hour). Must be in the future when combined with schedule_date."
              },
              "schedule_timezone": {
               "Type": "string",
               "Description": "IANA timezone for schedule interpretation (e.g., 'America/New_York', 'UTC'). Default: 'UTC'."
              },
              "show_live": {
               "Type": "boolean"
              },
              "tags": {
               "Type": "array",
               "Items": {
                "Type": "string"
               }
              },
              "healthy_threshold": {
               "Type": "integer"
              },
              "native_run_mode": {
               "Type": "object",
               "Description": "Traffic shape. Omit this object for Standard mode; include it to select Native mode. Only script-based tests (jmeter, k6, locust) support Native; Simple HTTP Endpoint tests always use Standard.\n\nStandard. Standard mode puts DLT in control of the load. You set the Fargate task count per Region, the concurrent virtual users per task, a ramp-up period, and a hold duration, and DLT runs the test through the Taurus automation framework, which applies those values over whatever load your script declares. A Region's virtual users are the task count multiplied by the per-task concurrency. Standard is the only mode that lets you set an exact virtual-user count and change the ramp-up and hold shape without editing the script, and the only one that supports the Simple HTTP Endpoint type. Its limit is expressiveness: anything Taurus cannot represent, such as weighted scenarios, per-stage thresholds, or arrival-rate executors, is unavailable. This is how every DLT test ran before v4.3.0, so existing scenarios keep behaving exactly as they did.\n\nNative. Native mode puts your script in control of the load. DLT runs the file you uploaded under the framework's own command line and passes no load flags, so your script is the sole authority on the traffic it generates. Two controls remain: how many Fargate tasks to launch per Region, and a required safety duration of up to 24 hours. The safety duration guards against a script that never exits rather than scheduling the run: if the test is still going when it elapses, DLT stops the framework, keeps the results for the portion that ran, and records the run as completed. Tasks are uncoordinated and each runs a full copy of the script, so a k6 script holding 200 virtual users on five tasks puts 1,000 virtual users on the target. Task count is therefore the only load dial; changing the ramp, the hold time, or the virtual-user count means editing the script. Native requires an uploaded script, so Simple HTTP Endpoint is unavailable, and Locust scripts must not set processes.",
               "Required": [
                "maxTestDurationSeconds"
               ],
               "Properties": {
                "maxTestDurationSeconds": {
                 "Type": "integer",
                 "Description": "Native mode safety timeout in seconds, required whenever native_run_mode is present. It guards against a script that never exits rather than scheduling the run: if the test is still running when the timeout elapses, DLT stops the framework, collects the results for the portion that ran, and records the run as completed rather than failed. Must be between 1 and 86400 (24 hours)."
                }
               }
              }
             }
            }
           },
           {
            "Name": "update_cron_schedule",
            "Description": "Update the configuration for an existing recurring scheduled test. This is a full replace of the test configuration including schedule fields — retrieve the current configuration with get_scenario_details first, modify the fields, and submit the complete configuration. The test must already be in 'scheduled' status.",
            "InputSchema": {
             "Type": "object",
             "Required": [
              "test_id",
              "test_name",
              "test_description",
              "test_type",
              "test_task_configs",
              "test_scenario",
              "cron_value",
              "recurrence"
             ],
             "Properties": {
              "test_id": {
               "Type": "string",
               "Description": "The existing test scenario's unique identifier"
              },
              "test_name": {
               "Type": "string",
               "Description": "Human-readable name for the test scenario"
              },
              "test_description": {
               "Type": "string",
               "Description": "Description of what this test validates"
              },
              "test_type": {
               "Type": "string",
               "Description": "Test type"
              },
              "test_task_configs": {
               "Type": "array",
               "Items": {
                "Type": "object",
                "Required": [
                 "region",
                 "task_count",
                 "concurrency"
                ],
                "Properties": {
                 "region": {
                  "Type": "string"
                 },
                 "task_count": {
                  "Type": "integer"
                 },
                 "concurrency": {
                  "Type": "integer"
                 }
                }
               }
              },
              "test_scenario": {
               "Type": "object",
               "Required": [
                "execution",
                "scenarios"
               ]
              },
              "cron_value": {
               "Type": "string",
               "Description": "Cron expression for the recurring schedule. Standard 5-field cron format."
              },
              "recurrence": {
               "Type": "string",
               "Description": "Human-readable recurrence label (e.g., 'daily', 'weekly')."
              },
              "cron_expiry_date": {
               "Type": "string",
               "Description": "Date when the recurring schedule expires. Format: YYYY-MM-DD. Optional — if omitted, the schedule runs indefinitely."
              },
              "schedule_timezone": {
               "Type": "string",
               "Description": "IANA timezone. Default: 'UTC'."
              },
              "show_live": {
               "Type": "boolean"
              },
              "tags": {
               "Type": "array",
               "Items": {
                "Type": "string"
               }
              },
              "healthy_threshold": {
               "Type": "integer"
              },
              "native_run_mode": {
               "Type": "object",
               "Description": "Traffic shape. Omit this object for Standard mode; include it to select Native mode. Only script-based tests (jmeter, k6, locust) support Native; Simple HTTP Endpoint tests always use Standard.\n\nStandard. Standard mode puts DLT in control of the load. You set the Fargate task count per Region, the concurrent virtual users per task, a ramp-up period, and a hold duration, and DLT runs the test through the Taurus automation framework, which applies those values over whatever load your script declares. A Region's virtual users are the task count multiplied by the per-task concurrency. Standard is the only mode that lets you set an exact virtual-user count and change the ramp-up and hold shape without editing the script, and the only one that supports the Simple HTTP Endpoint type. Its limit is expressiveness: anything Taurus cannot represent, such as weighted scenarios, per-stage thresholds, or arrival-rate executors, is unavailable. This is how every DLT test ran before v4.3.0, so existing scenarios keep behaving exactly as they did.\n\nNative. Native mode puts your script in control of the load. DLT runs the file you uploaded under the framework's own command line and passes no load flags, so your script is the sole authority on the traffic it generates. Two controls remain: how many Fargate tasks to launch per Region, and a required safety duration of up to 24 hours. The safety duration guards against a script that never exits rather than scheduling the run: if the test is still going when it elapses, DLT stops the framework, keeps the results for the portion that ran, and records the run as completed. Tasks are uncoordinated and each runs a full copy of the script, so a k6 script holding 200 virtual users on five tasks puts 1,000 virtual users on the target. Task count is therefore the only load dial; changing the ramp, the hold time, or the virtual-user count means editing the script. Native requires an uploaded script, so Simple HTTP Endpoint is unavailable, and Locust scripts must not set processes.",
               "Required": [
                "maxTestDurationSeconds"
               ],
               "Properties": {
                "maxTestDurationSeconds": {
                 "Type": "integer",
                 "Description": "Native mode safety timeout in seconds, required whenever native_run_mode is present. It guards against a script that never exits rather than scheduling the run: if the test is still running when the timeout elapses, DLT stops the framework, collects the results for the portion that ran, and records the run as completed rather than failed. Must be between 1 and 86400 (24 hours)."
                }
               }
              }
             }
            }
           },
           {
            "Name": "upload_test_script",
            "Description": "Upload a test script file required for script-based tests (JMeter, k6, or Locust). Must be called BEFORE create_test, create_simple_schedule, or create_cron_schedule when creating a new script-based test — this tool generates the test_id that you then pass to the subsequent tool. For updating an existing test's script, pass the existing test_id. Returns a test_id and script_filename. The script_filename must be referenced in the test_scenario.scenarios object when calling create_test, update_test, or any schedule tool. For files under 25KB, include base64-encoded content directly in file_content. For larger files (or if you're unsure of size), omit file_content to receive a presigned upload URL instead. When a presigned URL is returned, upload the file yourself if you have shell access (e.g. via the returned curl command), otherwise surface the upload_command to the user so they can run it manually.",
            "InputSchema": {
             "Type": "object",
             "Required": [
              "test_type",
              "file_extension"
             ],
             "Properties": {
              "test_id": {
               "Type": "string",
               "Description": "The test scenario's unique identifier. Omit for new tests (system will generate one and return it). Provide for existing tests to upload a new script to the correct location."
              },
              "test_type": {
               "Type": "string",
               "Description": "The test type this script is for. Determines the S3 storage path."
              },
              "file_extension": {
               "Type": "string",
               "Description": "File extension of the script. Use 'jmx' for JMeter, 'js' or 'ts' for k6, 'py' for Locust, or 'zip' for any type packaged as a zip archive."
              },
              "file_content": {
               "Type": "string",
               "Description": "Base64 encoded content of the script file. Include for small files (under 25KB). Omit for larger files to receive a presigned upload URL instead."
              }
             }
            }
           },
           {
            "Name": "get_workflow_guides",
            "Description": "Get step-by-step workflow recipes for common multi-tool DLT operations. Call this before performing multi-step tasks. For complex requests that span multiple operations, consult multiple workflows and chain them — the test_id returned from one operation can be used in subsequent operations. Note: script-based tests (jmeter, k6, locust) require calling upload_test_script before creating the test — the workflows below include this step. Available workflows: 'run_and_monitor' (start an existing test and poll until complete), 'baseline_comparison' (run a test and compare results against baseline), 'schedule_test' (create a test with a one-time or recurring schedule), 'create_and_run' (create a new test and immediately execute it), 'create_native_and_run' (create a Native traffic-shape test that runs an uploaded script exactly as authored, then execute it), 'update_and_run' (modify an existing test and execute it).",
            "InputSchema": {
             "Type": "object",
             "Required": [
              "workflow"
             ],
             "Properties": {
              "workflow": {
               "Type": "string",
               "Description": "The workflow to retrieve guidance for"
              }
             }
            }
           }
          ],
          [
           {
            "Name": "list_scenarios",
            "Description": "Retrieve a list of all available test scenarios",
            "InputSchema": {
             "Required": [],
             "Type": "object"
            }
           },
           {
            "Name": "get_scenario_details",
            "Description": "Retrieve the test configuration and most recent test run for a single test scenario. The response reports the scenario's traffic-shape mode: a nativeRunMode object means Native, where the uploaded script owns the load and each task runs a full copy of it, and its absence means Standard, where the stored concurrency, ramp-up, and hold-for values are the load. For a Native scenario the stored concurrency, ramp-up, and hold-for values were never applied, so do not report them as the load and do not reuse them when composing an update.",
            "InputSchema": {
             "Properties": {
              "test_id": {
               "Description": "The test scenario's unique identifier",
               "Type": "string"
              }
             },
             "Required": [
              "test_id"
             ],
             "Type": "object"
            }
           },
           {
            "Name": "list_test_runs",
            "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": "get_test_run",
            "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_latest_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_baseline_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_test_run_artifacts",
            "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"
            }
           }
          ]
         ]
        }
       }
      }
     }
    }
   },
   "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.3.0/d252fea3cc839df94a730a7e7f705c6a770ae16b1d2c65d80132fa0647384904.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.3.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"
     ]
    }
   }
  },
  "SolutionMetricsNewMetricsLambdaSqsEventSourcedistributedloadtestingonawsSolutionMetricsNewLambdaToSqsToLambdalambdatosqsqueue7D711FD8ACD4B87F": {
   "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/3VVWW/bOBD+LXmn2RzdBfZtXTlpAyRb13KzjwZNjRXGFEfhDG0Ygv77gpRkKce+aE4Oh3N8upbN9Z9/yMsLdaSZLvYza7ayyVnpvch2bqm8qoDBR2EVLET6qOrauDKyGbrCsEEn1JE2Dehr2WQ797TMojUPWwccuXvH4B3wd8VwVKcUDQPDWm27mE/LrLfNmZV+rsDx2WuMNR6aE6E2Kt0dzaCDN3z67jHUHxS3pQeiVhhVyWaJ1uiUQs+tsMsh0lbQjWy+Bb3vEu+5jown38id8E0RtMKqaluojcMCXkj+k8hdcDrlSTebRhEBk5xHIgqoLZ7iW2UXZHFWDKFSPc8Rsp17UCfwT+ApyrlxpQXG0WPqugRfGUqOtwdwnGPwGibt+6hthbYYip1Hx+nqn96Uxs21BqIMHXu0YgVUoyP4AaoAT2NZPjcsDLE32zCkNZVbUZycqrDYyuY8DIlpBWhKKWQ2UBzBO+VLFdtP+wXsjDNDwPcadKyMAz/qWmGxJNk8YHmekDOfhy1pb+roeGdsP+2faH8F8Ke3V79T9eU7KtbPsplb5avolZhWQCw3yWZYpEhbQQz1ru8aySYPWgMUYqmIxKOqRfaMRoP4VxkeSwlFNOWsGB6VfjauW5KJ/C7whhXtST6kobp3B9yDULUpu6WTzQqI57Xpuziwc60xOBbjXKYGjlLOqhyuLiFORpqmuAziEfgZi4QYHTdY+0s6fgWvAYiflDWFYuyQ5p2uFQZZjhursXSGUTa/CfwS0cZDU/4BywVYcwB/ytDtTBn8GSoGvwVWyjgxiJk1/fM+au4LcGz4NISfyhE13mLWcD7Sc/jhvTn4Qzdgn1tasYXCo96rEhxr9JB2YAKcPbtWvgRuBb2SbH4FCNDPYwCRvuNaTsS2FQl6YrsiCPR4ZSOobNSRtDVyfqTMmoQzIgvEWP1P40blz8B1YKGT98b3FpJLjwdTxFddXV7Kq4u/42+G0Kbdp5lGR+yDZvoSDc2IPTO6kVmU7qK0xvym256tN0UJsx4bb0fVGrvR7l80a+iVBrfOssb8lc5usWwTfarj4D/xa1sRsVy+0JfD9Vd59Ze8vHghY2Y+ODYVyFVH/wPnlGu7SAcAAA=="
   },
   "Condition": "CDKMetadataAvailable"
  }
 },
 "Outputs": {
  "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://",
      {
       "Fn::GetAtt": [
        "DLTConsoleResourcesDLTDashboardS3CloudFrontDistribution1F11B8BB",
        "DomainName"
       ]
      }
     ]
    ]
   }
  },
  "ConsoleResourceBucket": {
   "Description": "Resource Bucket for Web Portal",
   "Value": {
    "Ref": "DLTConsoleResourcesDLTDashboardS3S3Bucket8E2568BB"
   }
  },
  "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": "cloudfront"
  },
  "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"
  }
 }
}