{
 "Description": "(SO0062) - Distributed Load Testing on AWS. Fargate-based load testing with JMeter, K6, and Locust. CloudFront web console. Version v4.1.0",
 "AWSTemplateFormatVersion": "2010-09-09",
 "Metadata": {
  "AWS::CloudFormation::Interface": {
   "ParameterGroups": [
    {
     "Label": {
      "default": "Console access"
     },
     "Parameters": [
      "AdminName",
      "AdminEmail"
     ]
    },
    {
     "Label": {
      "default": "Network configurations for running distributed load test Fargate tasks"
     },
     "Parameters": [
      "ExistingVPCId",
      "ExistingSubnetA",
      "ExistingSubnetB",
      "VpcCidrBlock",
      "SubnetACidrBlock",
      "SubnetBCidrBlock",
      "EgressCidr"
     ]
    }
   ],
   "ParameterLabels": {
    "AdminName": {
     "default": "* Administrator Name"
    },
    "AdminEmail": {
     "default": "* Administrator Email"
    },
    "DeployMCPServer": {
     "default": "Deploy MCP Server"
    },
    "ExistingVPCId": {
     "default": "Select an existing VPC in the region"
    },
    "ExistingSubnetA": {
     "default": "Select first subnet from the existing VPC"
    },
    "ExistingSubnetB": {
     "default": "Select second subnet from the existing VPC"
    },
    "VpcCidrBlock": {
     "default": "Provide valid CIDR block for the solution to create VPC"
    },
    "SubnetACidrBlock": {
     "default": "Provide valid CIDR block for subnet A for the solution to create VPC"
    },
    "SubnetBCidrBlock": {
     "default": "Provide valid CIDR block for subnet B for the solution to create VPC"
    },
    "EgressCidr": {
     "default": "Provide CIDR block for allowing outbound traffic of AWS Fargate tasks"
    },
    "UseStableTagging": {
     "default": "Auto-update Container Image"
    }
   }
  }
 },
 "Parameters": {
  "AdminName": {
   "Type": "String",
   "AllowedPattern": "[a-zA-Z0-9-]+",
   "ConstraintDescription": "Admin username must be a minimum of 4 characters and cannot include spaces",
   "MaxLength": 20,
   "MinLength": 4
  },
  "AdminEmail": {
   "Type": "String",
   "AllowedPattern": "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$",
   "ConstraintDescription": "Admin email must be a valid email address",
   "MinLength": 5
  },
  "ExistingVPCId": {
   "Type": "String",
   "Default": "",
   "AllowedPattern": "(?:^$|^vpc-[a-zA-Z0-9-]+)",
   "Description": "Existing VPC ID"
  },
  "ExistingSubnetA": {
   "Type": "String",
   "Default": "",
   "AllowedPattern": "(?:^$|^subnet-[a-zA-Z0-9-]+)",
   "Description": "First existing subnet"
  },
  "ExistingSubnetB": {
   "Type": "String",
   "Default": "",
   "AllowedPattern": "(?:^$|^subnet-[a-zA-Z0-9-]+)",
   "Description": "Second existing subnet"
  },
  "VpcCidrBlock": {
   "Type": "String",
   "Default": "192.168.0.0/16",
   "AllowedPattern": "(^$|(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})$)",
   "ConstraintDescription": "The VPC CIDR block must be a valid IP CIDR range of the form x.x.x.x/x.",
   "Description": "You may leave this parameter blank if you are using existing VPC"
  },
  "SubnetACidrBlock": {
   "Type": "String",
   "Default": "192.168.0.0/20",
   "AllowedPattern": "(^$|(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})$)",
   "ConstraintDescription": "The subnet CIDR block must be a valid IP CIDR range of the form x.x.x.x/x.",
   "Description": "CIDR block for subnet A of the AWS Fargate VPC"
  },
  "SubnetBCidrBlock": {
   "Type": "String",
   "Default": "192.168.16.0/20",
   "AllowedPattern": "(^$|(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})$)",
   "ConstraintDescription": "The subnet CIDR block must be a valid IP CIDR range of the form x.x.x.x/x.",
   "Description": "CIDR block for subnet B of the AWS Fargate VPC"
  },
  "EgressCidr": {
   "Type": "String",
   "Default": "0.0.0.0/0",
   "AllowedPattern": "((\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2}))",
   "ConstraintDescription": "The Egress CIDR block must be a valid IP CIDR range of the form x.x.x.x/x.",
   "Description": "CIDR Block to restrict the Amazon ECS container outbound access",
   "MaxLength": 18,
   "MinLength": 9
  },
  "UseStableTagging": {
   "Type": "String",
   "Default": "No",
   "AllowedValues": [
    "Yes",
    "No"
   ],
   "Description": "Automatically use the most up to date and secure image up until the next minor release. Selecting 'No' will pull the image as originally released, without any security updates."
  },
  "DeployMCPServer": {
   "Type": "String",
   "Default": "No",
   "AllowedValues": [
    "Yes",
    "No"
   ],
   "Description": "Deploy a remote MCP server to connect AI applications to DLT. See the Implementation Guide for more details."
  }
 },
 "Rules": {
  "ExistingVPCRule": {
   "RuleCondition": {
    "Fn::Not": [
     {
      "Fn::Equals": [
       {
        "Ref": "ExistingVPCId"
       },
       ""
      ]
     }
    ]
   },
   "Assertions": [
    {
     "Assert": {
      "Fn::Not": [
       {
        "Fn::Equals": [
         {
          "Ref": "ExistingSubnetA"
         },
         ""
        ]
       }
      ]
     },
     "AssertDescription": "If an existing VPC Id is provided, 2 subnet ids need to be provided as well. You neglected to enter the first subnet id"
    },
    {
     "Assert": {
      "Fn::Not": [
       {
        "Fn::Equals": [
         {
          "Ref": "ExistingSubnetB"
         },
         ""
        ]
       }
      ]
     },
     "AssertDescription": "If an existing VPC Id is provided, 2 subnet ids need to be provided as well. You neglected to enter the second subnet id"
    }
   ]
  }
 },
 "Mappings": {
  "Solution": {
   "Config": {
    "CodeVersion": "v4.1.0",
    "SolutionId": "SO0062"
   }
  }
 },
 "Conditions": {
  "CreateFargateVPCResources": {
   "Fn::Equals": [
    {
     "Ref": "ExistingVPCId"
    },
    ""
   ]
  },
  "BoolExistingVPC": {
   "Fn::Not": [
    {
     "Fn::Equals": [
      {
       "Ref": "ExistingVPCId"
      },
      ""
     ]
    }
   ]
  },
  "UseStableTagCondition": {
   "Fn::Equals": [
    {
     "Ref": "UseStableTagging"
    },
    "Yes"
   ]
  },
  "DeployMCPServerCondition": {
   "Fn::Equals": [
    {
     "Ref": "DeployMCPServer"
    },
    "Yes"
   ]
  },
  "DLTApiIsGovCloudPartition6BAD7D2E": {
   "Fn::Equals": [
    {
     "Ref": "AWS::Partition"
    },
    "aws-us-gov"
   ]
  },
  "DLTCognitoAuthIsGovCloudPartition9F5A131A": {
   "Fn::Equals": [
    {
     "Ref": "AWS::Partition"
    },
    "aws-us-gov"
   ]
  },
  "DLTCognitoAuthIsGovCloudEastRegion022D5DDD": {
   "Fn::Equals": [
    {
     "Ref": "AWS::Region"
    },
    "us-gov-east-1"
   ]
  },
  "CDKMetadataAvailable": {
   "Fn::Or": [
    {
     "Fn::Or": [
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "af-south-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-east-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-northeast-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-northeast-2"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-northeast-3"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-south-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-south-2"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-southeast-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-southeast-2"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-southeast-3"
       ]
      }
     ]
    },
    {
     "Fn::Or": [
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ap-southeast-4"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ca-central-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "ca-west-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "cn-north-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "cn-northwest-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-central-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-central-2"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-north-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-south-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-south-2"
       ]
      }
     ]
    },
    {
     "Fn::Or": [
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-west-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-west-2"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "eu-west-3"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "il-central-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "me-central-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "me-south-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "sa-east-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "us-east-1"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "us-east-2"
       ]
      },
      {
       "Fn::Equals": [
        {
         "Ref": "AWS::Region"
        },
        "us-west-1"
       ]
      }
     ]
    },
    {
     "Fn::Equals": [
      {
       "Ref": "AWS::Region"
      },
      "us-west-2"
     ]
    }
   ]
  }
 },
 "Resources": {
  "DLTVpcDLTFargateVpc0E6FEAB7": {
   "Type": "AWS::EC2::VPC",
   "Properties": {
    "CidrBlock": {
     "Ref": "VpcCidrBlock"
    },
    "EnableDnsHostnames": true,
    "EnableDnsSupport": true,
    "Tags": [
     {
      "Key": "Name",
      "Value": {
       "Ref": "AWS::StackName"
      }
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W60",
       "reason": "This VPC is used for the test runner Fargate tasks only, it does not require VPC flow logs."
      }
     ]
    }
   },
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTSubnetAAE7DDEE8": {
   "Type": "AWS::EC2::Subnet",
   "Properties": {
    "AvailabilityZone": {
     "Fn::Select": [
      0,
      {
       "Fn::GetAZs": ""
      }
     ]
    },
    "CidrBlock": {
     "Ref": "SubnetACidrBlock"
    },
    "VpcId": {
     "Ref": "DLTVpcDLTFargateVpc0E6FEAB7"
    }
   },
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTSubnetB294F4ED2": {
   "Type": "AWS::EC2::Subnet",
   "Properties": {
    "AvailabilityZone": {
     "Fn::Select": [
      1,
      {
       "Fn::GetAZs": ""
      }
     ]
    },
    "CidrBlock": {
     "Ref": "SubnetBCidrBlock"
    },
    "VpcId": {
     "Ref": "DLTVpcDLTFargateVpc0E6FEAB7"
    }
   },
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTFargateIG0E71BA5C": {
   "Type": "AWS::EC2::InternetGateway",
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTFargateRT86406464": {
   "Type": "AWS::EC2::RouteTable",
   "Properties": {
    "VpcId": {
     "Ref": "DLTVpcDLTFargateVpc0E6FEAB7"
    }
   },
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTGatewayattachment220D400F": {
   "Type": "AWS::EC2::VPCGatewayAttachment",
   "Properties": {
    "InternetGatewayId": {
     "Ref": "DLTVpcDLTFargateIG0E71BA5C"
    },
    "VpcId": {
     "Ref": "DLTVpcDLTFargateVpc0E6FEAB7"
    }
   },
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTRouteF8F2A836": {
   "Type": "AWS::EC2::Route",
   "Properties": {
    "DestinationCidrBlock": "0.0.0.0/0",
    "GatewayId": {
     "Ref": "DLTVpcDLTFargateIG0E71BA5C"
    },
    "RouteTableId": {
     "Ref": "DLTVpcDLTFargateRT86406464"
    }
   },
   "DependsOn": [
    "DLTVpcDLTGatewayattachment220D400F"
   ],
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTRouteTableAssociationAE94A08EA": {
   "Type": "AWS::EC2::SubnetRouteTableAssociation",
   "Properties": {
    "RouteTableId": {
     "Ref": "DLTVpcDLTFargateRT86406464"
    },
    "SubnetId": {
     "Ref": "DLTVpcDLTSubnetAAE7DDEE8"
    }
   },
   "Condition": "CreateFargateVPCResources"
  },
  "DLTVpcDLTRouteTableAssociationBBED3E4B3": {
   "Type": "AWS::EC2::SubnetRouteTableAssociation",
   "Properties": {
    "RouteTableId": {
     "Ref": "DLTVpcDLTFargateRT86406464"
    },
    "SubnetId": {
     "Ref": "DLTVpcDLTSubnetB294F4ED2"
    }
   },
   "Condition": "CreateFargateVPCResources"
  },
  "DLTCommonResourcesCloudWatchLogsPolicyB29337B0": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":logs:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":log-group:/aws/lambda/*"
         ]
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTCommonResourcesCloudWatchLogsPolicyB29337B0",
    "Roles": [
     {
      "Ref": "DLTCommonResourcesCustomResourceCustomResourceLambdaRole248397C4"
     },
     {
      "Ref": "RealTimeDatarealTimeDataPublisherRoleA8976D01"
     },
     {
      "Ref": "DLTLambdaFunctionLambdaResultsRole2CF2D707"
     },
     {
      "Ref": "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD"
     },
     {
      "Ref": "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF"
     },
     {
      "Ref": "DLTLambdaFunctionTaskStatusRole9288E645"
     },
     {
      "Ref": "DLTLambdaFunctionTestCleanupRoleDC0BEA52"
     },
     {
      "Ref": "DLTLambdaFunctionStabilizationCheckerRole6CBA6344"
     },
     {
      "Ref": "DLTLambdaFunctionStartCommandRole3F343C56"
     },
     {
      "Ref": "DLTLambdaFunctionRegionalSyncRole8A668DCC"
     },
     {
      "Ref": "DLTLambdaFunctionTaskFailureHandlerRoleB2F5047C"
     },
     {
      "Ref": "DLTLambdaFunctionOrphanCleanupRoleB4AD3115"
     },
     {
      "Ref": "DLTLambdaFunctionSFNFailureHandlerRole383D70B7"
     },
     {
      "Ref": "DLTLambdaFunctionTestStatusUpdaterRole997B3321"
     },
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   }
  },
  "DLTCommonResourcesLogsBucket48A2774D": {
   "Type": "AWS::S3::Bucket",
   "Properties": {
    "AccessControl": "LogDeliveryWrite",
    "BucketEncryption": {
     "ServerSideEncryptionConfiguration": [
      {
       "ServerSideEncryptionByDefault": {
        "SSEAlgorithm": "AES256"
       }
      }
     ]
    },
    "OwnershipControls": {
     "Rules": [
      {
       "ObjectOwnership": "ObjectWriter"
      }
     ]
    },
    "PublicAccessBlockConfiguration": {
     "BlockPublicAcls": true,
     "BlockPublicPolicy": true,
     "IgnorePublicAcls": true,
     "RestrictPublicBuckets": true
    },
    "VersioningConfiguration": {
     "Status": "Enabled"
    }
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W35",
       "reason": "This is the logging bucket, it does not require logging."
      },
      {
       "id": "W51",
       "reason": "Since the bucket does not allow the public access, it does not require to have bucket policy."
      }
     ]
    }
   }
  },
  "DLTCommonResourcesLogsBucketPolicyAA7FFB37": {
   "Type": "AWS::S3::BucketPolicy",
   "Properties": {
    "Bucket": {
     "Ref": "DLTCommonResourcesLogsBucket48A2774D"
    },
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "s3:*",
       "Condition": {
        "Bool": {
         "aws:SecureTransport": "false"
        }
       },
       "Effect": "Deny",
       "Principal": {
        "AWS": "*"
       },
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTCommonResourcesLogsBucket48A2774D",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTCommonResourcesLogsBucket48A2774D",
             "Arn"
            ]
           },
           "/*"
          ]
         ]
        }
       ]
      }
     ],
     "Version": "2012-10-17"
    }
   }
  },
  "DLTCommonResourcesCustomResourceCustomResourceLambdaRole248397C4": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "iot:DescribeEndpoint",
          "iot:DetachPrincipalPolicy"
         ],
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": "iot:ListTargetsForPolicy",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":iot:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":policy/*"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "CustomResourcePolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "iot:DescribeEndpoint and iot:DetachPrincipalPolicy cannot specify the resource."
      }
     ]
    },
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTCommonResourcesCustomResourceCustomResourceLambdaRoleDefaultPolicy315DBE14": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "s3:DeleteObject*",
        "s3:PutObject",
        "s3:PutObjectLegalHold",
        "s3:PutObjectRetention",
        "s3:PutObjectTagging",
        "s3:PutObjectVersionTagging",
        "s3:Abort*"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
             "Arn"
            ]
           },
           "/*"
          ]
         ]
        }
       ]
      },
      {
       "Action": [
        "dynamodb:BatchGetItem",
        "dynamodb:Query",
        "dynamodb:GetItem",
        "dynamodb:Scan",
        "dynamodb:ConditionCheckItem",
        "dynamodb:BatchWriteItem",
        "dynamodb:PutItem",
        "dynamodb:UpdateItem",
        "dynamodb:DeleteItem",
        "dynamodb:DescribeTable"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
          "Arn"
         ]
        }
       ]
      },
      {
       "Action": [
        "dynamodb:GetRecords",
        "dynamodb:GetShardIterator"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
          "Arn"
         ]
        }
       ]
      },
      {
       "Action": "events:ListRules",
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":events:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":rule/*"
         ]
        ]
       }
      },
      {
       "Action": [
        "events:PutTargets",
        "events:ListTargetsByRule"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":events:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":rule/*Create"
          ]
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":events:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":rule/*Scheduled"
          ]
         ]
        }
       ]
      },
      {
       "Action": [
        "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.1.0/a3fa52a5a11876f72dd3b47e4835c1cdadce9523168f9b145a5f06b0bf5250f1.zip"
    },
    "Description": "CFN Lambda backed custom resource to deploy assets to s3",
    "Environment": {
     "Variables": {
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "MAIN_REGION": {
       "Ref": "AWS::Region"
      },
      "S3_BUCKET": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "DDB_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTCommonResourcesCustomResourceCustomResourceLambdaRole248397C4",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 120
   },
   "DependsOn": [
    "DLTCommonResourcesCustomResourceCustomResourceLambdaRoleDefaultPolicy315DBE14",
    "DLTCommonResourcesCustomResourceCustomResourceLambdaRole248397C4"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "VPC not needed for lambda"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "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.1.0/e2659170a0721541efa761a8d5d04d5e36cbbf691c4b15a9053002b7c825055d.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.1.0/5561cf82d4c3e10c7cd2c293fb751ffda8eba96f767636ca6d3ea8e8f821bec4.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.1.0/3423a042b818e31c1e34a19d6689ab2e5f9b70fcbe9e71df66f241b20a200bd9.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"
       ]
      }
     ]
    },
    "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"
  },
  "DLTCustomResourcesPutRegionalTemplate5479575B": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "Resource": "PutRegionalTemplate",
    "SrcBucket": {
     "Fn::Join": [
      "-",
      [
       "solutions",
       {
        "Ref": "AWS::Region"
       }
      ]
     ]
    },
    "SrcPath": "distributed-load-testing-on-aws/v4.1.0",
    "DestBucket": {
     "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
    },
    "MainRegionLambdaTaskRoleArn": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD",
      "Arn"
     ]
    },
    "ScenariosTable": {
     "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
    },
    "MainRegionStack": {
     "Ref": "AWS::Region"
    },
    "Timestamp": "1779160293018"
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCustomResourcesCopyJMeterBundle9E5A5E5E": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "Resource": "CopyJMeterBundle",
    "SrcBucket": {
     "Fn::Join": [
      "-",
      [
       "solutions",
       {
        "Ref": "AWS::Region"
       }
      ]
     ]
    },
    "SrcPath": "distributed-load-testing-on-aws/v4.1.0",
    "DestBucket": {
     "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
    },
    "Timestamp": "1779160293018"
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCustomResourcesTestingResourcesConfig0BCA657F": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "TestingResourcesConfig": {
     "region": {
      "Ref": "AWS::Region"
     },
     "subnetA": {
      "Fn::If": [
       "CreateFargateVPCResources",
       {
        "Ref": "DLTVpcDLTSubnetAAE7DDEE8"
       },
       {
        "Ref": "ExistingSubnetA"
       }
      ]
     },
     "subnetB": {
      "Fn::If": [
       "CreateFargateVPCResources",
       {
        "Ref": "DLTVpcDLTSubnetB294F4ED2"
       },
       {
        "Ref": "ExistingSubnetB"
       }
      ]
     },
     "ecsCloudWatchLogGroup": {
      "Ref": "DLTEcsDLTCloudWatchLogsGroupFE9EC144"
     },
     "taskSecurityGroup": {
      "Ref": "DLTEcsDLTEcsSecurityGroup69E6743C"
     },
     "taskDefinition": {
      "Ref": "DLTEcsDLTTaskDefinitionFB4E5564"
     },
     "taskCluster": {
      "Ref": "DLTEcsDLTEcsClusterBC5CE23B"
     },
     "version": "v4.1.0",
     "stackId": {
      "Ref": "AWS::StackId"
     },
     "taskRoleArn": {
      "Fn::GetAtt": [
       "DLTEcsDLTTaskRoleD37E29C5",
       "Arn"
      ]
     },
     "executionRoleArn": {
      "Fn::GetAtt": [
       "DLTEcsDLTTaskExecutionRoleDE668717",
       "Arn"
      ]
     }
    },
    "Resource": "TestingResourcesConfigFile"
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCustomResourcesMetricA23693FA": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCustomResourceInfraCustomResourceLambdaA4053269",
      "Arn"
     ]
    },
    "existingVPC": {
     "Fn::If": [
      "BoolExistingVPC",
      true,
      false
     ]
    },
    "Region": {
     "Ref": "AWS::Region"
    },
    "Resource": "Metric",
    "SolutionId": {
     "Fn::FindInMap": [
      "Solution",
      "Config",
      "SolutionId"
     ]
    },
    "UUID": {
     "Fn::GetAtt": [
      "DLTCustomResourcesCustomResourceUuidD1C03F15",
      "UUID"
     ]
    },
    "Version": {
     "Fn::FindInMap": [
      "Solution",
      "Config",
      "CodeVersion"
     ]
    },
    "AccountId": {
     "Ref": "AWS::AccountId"
    },
    "AutoUpdateContainerImage": {
     "Ref": "UseStableTagging"
    },
    "DeployMcpServer": {
     "Ref": "DeployMCPServer"
    }
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTEcsDLTEcsClusterBC5CE23B": {
   "Type": "AWS::ECS::Cluster",
   "Properties": {
    "ClusterName": {
     "Ref": "AWS::StackName"
    },
    "ClusterSettings": [
     {
      "Name": "containerInsights",
      "Value": "enabled"
     }
    ],
    "Tags": [
     {
      "Key": "CloudFormation Stack",
      "Value": {
       "Ref": "AWS::StackName"
      }
     },
     {
      "Key": "SolutionId",
      "Value": "SO0062"
     }
    ]
   }
  },
  "DLTEcsDLTTaskExecutionRoleDE668717": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "ecr:GetAuthorizationToken",
          "ecr:BatchCheckLayerAvailability",
          "ecr:GetDownloadUrlForLayer",
          "ecr:BatchGetImage",
          "logs:CreateLogStream",
          "logs:PutLogEvents"
         ],
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "ECSTaskExecutionPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_POLICYDOCUMENT_NO_WILDCARD_RESOURCE",
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTEcsDLTTaskExecutionRoleDefaultPolicy3A93A204": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTEcsDLTCloudWatchLogsGroupFE9EC144",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTEcsDLTTaskExecutionRoleDefaultPolicy3A93A204",
    "Roles": [
     {
      "Ref": "DLTEcsDLTTaskExecutionRoleDE668717"
     }
    ]
   }
  },
  "DLTEcsDLTTaskRoleD37E29C5": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "s3:HeadObject",
          "s3:PutObject",
          "s3:GetObject",
          "s3:ListBucket"
         ],
         "Effect": "Allow",
         "Resource": [
          {
           "Fn::Join": [
            "",
            [
             "arn:",
             {
              "Ref": "AWS::Partition"
             },
             ":s3:::",
             {
              "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
             }
            ]
           ]
          },
          {
           "Fn::Join": [
            "",
            [
             "arn:",
             {
              "Ref": "AWS::Partition"
             },
             ":s3:::",
             {
              "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
             },
             "/*"
            ]
           ]
          }
         ]
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "ScenariosS3Policy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_POLICYDOCUMENT_NO_WILDCARD_RESOURCE",
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTEcsDLTCloudWatchLogsGroupFE9EC144": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "RetentionInDays": 3653,
    "Tags": [
     {
      "Key": "SolutionId",
      "Value": "SO0062"
     }
    ]
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W84",
       "reason": "KMS encryption unnecessary for log group"
      }
     ]
    }
   }
  },
  "DLTEcsDLTCloudWatchLogsGroupECSLogSubscriptionFilterCanInvokeLambdaF6EFF73B": {
   "Type": "AWS::Lambda::Permission",
   "Properties": {
    "Action": "lambda:InvokeFunction",
    "FunctionName": {
     "Fn::GetAtt": [
      "RealTimeDataRealTimeDataPublisherNew82D06000",
      "Arn"
     ]
    },
    "Principal": "logs.amazonaws.com",
    "SourceArn": {
     "Fn::GetAtt": [
      "DLTEcsDLTCloudWatchLogsGroupFE9EC144",
      "Arn"
     ]
    }
   }
  },
  "DLTEcsDLTCloudWatchLogsGroupECSLogSubscriptionFilterC5BB4DB5": {
   "Type": "AWS::Logs::SubscriptionFilter",
   "Properties": {
    "DestinationArn": {
     "Fn::GetAtt": [
      "RealTimeDataRealTimeDataPublisherNew82D06000",
      "Arn"
     ]
    },
    "FilterPattern": "\"INFO: Current:\" \"live=true\"",
    "LogGroupName": {
     "Ref": "DLTEcsDLTCloudWatchLogsGroupFE9EC144"
    }
   },
   "DependsOn": [
    "DLTEcsDLTCloudWatchLogsGroupECSLogSubscriptionFilterCanInvokeLambdaF6EFF73B"
   ]
  },
  "DLTEcsMetricFilterCountAlarm6B9438DB": {
   "Type": "AWS::CloudWatch::Alarm",
   "Properties": {
    "AlarmDescription": "Alarm when metric filter count approaches the limit of 100",
    "AlarmName": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-MetricFilterCount-Alarm"
      ]
     ]
    },
    "ComparisonOperator": "GreaterThanOrEqualToThreshold",
    "Dimensions": [
     {
      "Name": "LogGroupName",
      "Value": {
       "Ref": "DLTEcsDLTCloudWatchLogsGroupFE9EC144"
      }
     }
    ],
    "EvaluationPeriods": 1,
    "MetricName": "MetricFilterCount",
    "Namespace": "distributed-load-testing",
    "Period": 300,
    "Statistic": "Maximum",
    "Threshold": 90,
    "TreatMissingData": "notBreaching"
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CFN_NO_EXPLICIT_RESOURCE_NAMES"
     ]
    }
   }
  },
  "DLTEcsDLTTaskDefinitionFB4E5564": {
   "Type": "AWS::ECS::TaskDefinition",
   "Properties": {
    "ContainerDefinitions": [
     {
      "Environment": [
       {
        "Name": "JVM_ARGS",
        "Value": "-Xms1g -Xmx3g"
       }
      ],
      "Essential": true,
      "HealthCheck": {
       "Command": [
        "CMD-SHELL",
        "test -f /tmp/health_ready || exit 1"
       ],
       "Interval": 5,
       "Retries": 10,
       "StartPeriod": 10,
       "Timeout": 5
      },
      "Image": {
       "Fn::If": [
        "UseStableTagCondition",
        "public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-load-tester:v4.1_stable",
        "public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-load-tester:v4.1.0"
       ]
      },
      "LogConfiguration": {
       "LogDriver": "awslogs",
       "Options": {
        "awslogs-group": {
         "Ref": "DLTEcsDLTCloudWatchLogsGroupFE9EC144"
        },
        "awslogs-stream-prefix": "load-testing",
        "awslogs-region": {
         "Ref": "AWS::Region"
        }
       }
      },
      "Memory": 4096,
      "Name": {
       "Fn::Join": [
        "",
        [
         {
          "Ref": "AWS::StackName"
         },
         "-load-tester"
        ]
       ]
      }
     }
    ],
    "Cpu": "2048",
    "ExecutionRoleArn": {
     "Fn::GetAtt": [
      "DLTEcsDLTTaskExecutionRoleDE668717",
      "Arn"
     ]
    },
    "Family": "distributedloadtestingonawsDLTEcsDLTTaskDefinitionFFD96F9E",
    "Memory": "4096",
    "NetworkMode": "awsvpc",
    "RequiresCompatibilities": [
     "FARGATE"
    ],
    "Tags": [
     {
      "Key": "SolutionId",
      "Value": "SO0062"
     }
    ],
    "TaskRoleArn": {
     "Fn::GetAtt": [
      "DLTEcsDLTTaskRoleD37E29C5",
      "Arn"
     ]
    }
   }
  },
  "DLTEcsDLTEcsSecurityGroup69E6743C": {
   "Type": "AWS::EC2::SecurityGroup",
   "Properties": {
    "GroupDescription": "DLTS Tasks Security Group",
    "VpcId": {
     "Fn::If": [
      "CreateFargateVPCResources",
      {
       "Ref": "DLTVpcDLTFargateVpc0E6FEAB7"
      },
      {
       "Ref": "ExistingVPCId"
      }
     ]
    }
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W40",
       "reason": "IpProtocol set to -1 (any) as ports are not known prior to running tests"
      },
      {
       "id": "F1000",
       "reason": "egress rule is specificed as its own cfn resource."
      }
     ]
    }
   }
  },
  "DLTEcsDLTSecGroupEgressE1DA93E8": {
   "Type": "AWS::EC2::SecurityGroupEgress",
   "Properties": {
    "CidrIp": {
     "Ref": "EgressCidr"
    },
    "Description": "Allow tasks to call out to external resources",
    "GroupId": {
     "Ref": "DLTEcsDLTEcsSecurityGroup69E6743C"
    },
    "IpProtocol": "-1"
   }
  },
  "RealTimeDatarealTimeDataPublisherRoleA8976D01": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "iot:Publish",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":iot:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":topic/dlt/*"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "IoTPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "RealTimeDataRealTimeDataPublisherNew82D06000": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/1b2e70389c12c69e12b67c471b5626cd60ed08cfee99c27e5d8263adb2cac092.zip"
    },
    "Description": "Real time data publisher",
    "Environment": {
     "Variables": {
      "MAIN_REGION": {
       "Ref": "AWS::Region"
      },
      "IOT_ENDPOINT": {
       "Fn::Join": [
        "",
        [
         "https://",
         {
          "Fn::GetAtt": [
           "DLTCustomResourcesGetIotEndpoint700ABCC8",
           "IOT_ENDPOINT"
          ]
         }
        ]
       ]
      },
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0"
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "RealTimeDatarealTimeDataPublisherRoleA8976D01",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 180
   },
   "DependsOn": [
    "RealTimeDatarealTimeDataPublisherRoleA8976D01"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "RealTimeDataRealTimeDataPublisherLogGroup3FE55F9A": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "RealTimeDataRealTimeDataPublisherNew82D06000"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W84",
       "reason": "KMS encryption unnecessary for log group"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionLambdaResultsRole2CF2D707": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    }
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W12",
       "reason": "The action does not support resource level permissions."
      }
     ]
    },
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionLambdaResultsPolicyB191FC35": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "cloudwatch:GetMetricWidgetImage",
       "Effect": "Allow",
       "Resource": "*"
      },
      {
       "Action": "logs:DeleteMetricFilter",
       "Condition": {
        "StringEquals": {
         "aws:ResourceTag/SolutionId": "SO0062"
        }
       },
       "Effect": "Allow",
       "Resource": "*"
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTLambdaFunctionLambdaResultsPolicyB191FC35",
    "Roles": [
     {
      "Ref": "DLTLambdaFunctionLambdaResultsRole2CF2D707"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W12",
       "reason": "The action does not support resource level permissions."
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionResultsParserNew4A490450": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/d8a545d9730e5088dd4e99309ca9eb2a58f7ea5870bb8722cebc2d1c5621d4fe.zip"
    },
    "Description": "Result parser for indexing xml test results to DynamoDB",
    "Environment": {
     "Variables": {
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      },
      "HISTORY_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC"
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "SCENARIOS_BUCKET": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "SOLUTION_ID": "SO0062",
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "VERSION": "v4.1.0"
     }
    },
    "Handler": "index.handler",
    "MemorySize": 1024,
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionLambdaResultsRole2CF2D707",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 900
   },
   "DependsOn": [
    "DLTLambdaFunctionLambdaResultsRole2CF2D707"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionResultsParserLambdaLogGroupADF0ADEA": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionResultsParserNew4A490450"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W84",
       "reason": "KMS encryption unnecessary for log group"
      }
     ]
    },
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "ecs:DescribeTaskDefinition",
          "ecs:DeregisterTaskDefinition",
          "ecs:ListTaskDefinitions",
          "ecs:ListTasks"
         ],
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "EcsUnscopedActionsPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "ecs:RegisterTaskDefinition",
          "ecs:DeleteTaskDefinitions",
          "ecs:RunTask",
          "ecs:DescribeTasks",
          "ecs:TagResource",
          "ecs:CreateService",
          "ecs:UpdateService",
          "ecs:DeleteService",
          "ecs:DescribeServices",
          "logs:PutMetricFilter",
          "logs:DescribeMetricFilters"
         ],
         "Condition": {
          "StringEquals": {
           "aws:ResourceTag/SolutionId": "SO0062"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "EcsTagScopedPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "cloudwatch:PutMetricData",
         "Condition": {
          "StringEquals": {
           "cloudwatch:namespace": "distributed-load-testing"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "CloudWatchMetricPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "s3:PutObject",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            {
             "Fn::GetAtt": [
              "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
              "Arn"
             ]
            },
            "/*"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "S3WritePolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "iam:PassRole",
         "Condition": {
          "StringEquals": {
           "iam:PassedToService": "ecs-tasks.amazonaws.com"
          }
         },
         "Effect": "Allow",
         "Resource": [
          {
           "Fn::GetAtt": [
            "DLTEcsDLTTaskExecutionRoleDE668717",
            "Arn"
           ]
          },
          {
           "Fn::GetAtt": [
            "DLTEcsDLTTaskRoleD37E29C5",
            "Arn"
           ]
          }
         ]
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "IamPassRolePolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "cloudwatch:PutDashboard",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":cloudwatch::",
            {
             "Ref": "AWS::AccountId"
            },
            ":dashboard/EcsLoadTesting*"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "CloudWatchDashboardPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "ecs:ListTasks does not support resource level permissions"
      }
     ]
    },
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskRunnerNew5AE1A3C2": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/0edc882aeda2c73090b3c7d938701918163665528dd49cd8960065193155bc55.zip"
    },
    "Description": "Task runner for ECS task definitions",
    "Environment": {
     "Variables": {
      "SCENARIOS_BUCKET": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "MAIN_STACK_REGION": {
       "Ref": "AWS::Region"
      },
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 900
   },
   "DependsOn": [
    "DLTLambdaFunctionDLTTestLambdaTaskRole1FDBCEDD"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskRunnerLambdaLogGroupF801BE82": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionTaskRunnerNew5AE1A3C2"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "dynamodb:UpdateItem",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
           "Arn"
          ]
         }
        },
        {
         "Action": "dynamodb:PutItem",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTHistoryTable46D850CC",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "DynamoDbPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskCancelerNewA6986F4A": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/da2fde252c8e0b048bc7ef31e671ac4eace6e0c35de1d0b83511ad5174c9cc2c.zip"
    },
    "Description": "Coordinates test cancellation — sets CANCELLING status, invokes test-cleanup per region",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "HISTORY_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC"
      },
      "TEST_CLEANUP_ARN": {
       "Fn::GetAtt": [
        "DLTLambdaFunctionTestCleanupBBAA461F",
        "Arn"
       ]
      },
      "STATE_MACHINE_ARN": {
       "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
      },
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 300
   },
   "DependsOn": [
    "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskCancellerLambdaLogGroupBD1D284E": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionTaskCancelerNewA6986F4A"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskCancelerInvokePolicyA1C7562A": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTaskCancelerNewA6986F4A",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTLambdaFunctionTaskCancelerInvokePolicyA1C7562A",
    "Roles": [
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   }
  },
  "DLTLambdaFunctionTaskStatusRole9288E645": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "ecs:ListTasks",
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "EcsUnscopedActionsPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "ecs:DescribeTasks",
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": "s3:ListBucket",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "TaskStatusPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "ecs:ListTasks does not support resource level permissions"
      }
     ]
    },
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskStatusCheckerNew00D99653": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/608737227e38a79d761373c98b42f2d03a8389298b6599dc145217a08918ae30.zip"
    },
    "Description": "Task status checker — running check and S3 completion monitoring",
    "Environment": {
     "Variables": {
      "SCENARIOS_BUCKET": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "MAIN_STACK_REGION": {
       "Ref": "AWS::Region"
      },
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionTaskStatusRole9288E645",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 300
   },
   "DependsOn": [
    "DLTLambdaFunctionTaskStatusRole9288E645"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctiontaskStatusCheckerLambdaLogGroup1988969D": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionTaskStatusCheckerNew00D99653"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionTestCleanupRoleDC0BEA52": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "ecs:DeregisterTaskDefinition",
          "ecs:ListTaskDefinitions",
          "ecs:ListTasks"
         ],
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "EcsUnscopedActionsPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "ecs:UpdateService",
          "ecs:DeleteService",
          "ecs:DescribeServices",
          "ecs:DeleteTaskDefinitions"
         ],
         "Condition": {
          "StringEquals": {
           "aws:ResourceTag/SolutionId": "SO0062"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "EcsTagScopedPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "logs:DescribeMetricFilters",
          "logs:DeleteMetricFilter"
         ],
         "Condition": {
          "StringEquals": {
           "aws:ResourceTag/SolutionId": "SO0062"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "MetricFilterPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "cloudwatch:PutMetricData",
         "Condition": {
          "StringEquals": {
           "cloudwatch:namespace": "distributed-load-testing"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "CloudWatchMetricPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "dynamodb:UpdateItem",
         "Effect": "Allow",
         "Resource": [
          {
           "Fn::GetAtt": [
            "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
            "Arn"
           ]
          },
          {
           "Fn::GetAtt": [
            "DLTTestRunnerStorageDLTHistoryTable46D850CC",
            "Arn"
           ]
          }
         ]
        },
        {
         "Action": "dynamodb:PutItem",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTHistoryTable46D850CC",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "DynamoDbPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "ecs:ListTasks and ecs:DeregisterTaskDefinition do not support resource level permissions"
      }
     ]
    },
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionTestCleanupBBAA461F": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/42ffb393d418edee85506c84f539365861bbe514c1d5fdb0e32783865f6ea7bd.zip"
    },
    "Description": "Cleans up ECS resources for one region and sets final DDB status",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "HISTORY_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC"
      },
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionTestCleanupRoleDC0BEA52",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 900
   },
   "DependsOn": [
    "DLTLambdaFunctionTestCleanupRoleDC0BEA52"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionTestCleanupLambdaLogGroupC7B4FECA": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionTestCleanupBBAA461F"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionTestCleanupInvokePolicyA8E77925": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestCleanupBBAA461F",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTLambdaFunctionTestCleanupInvokePolicyA8E77925",
    "Roles": [
     {
      "Ref": "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF"
     }
    ]
   }
  },
  "DLTLambdaFunctionStabilizationCheckerRole6CBA6344": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "ecs:DescribeServices",
         "Condition": {
          "StringEquals": {
           "aws:ResourceTag/SolutionId": "SO0062"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "EcsTagScopedPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK",
      "IAM_POLICYDOCUMENT_NO_WILDCARD_RESOURCE"
     ]
    }
   }
  },
  "DLTLambdaFunctionStabilizationChecker9DA790EC": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/06431f39505dee20468fe8c33677e0880cb810cbe3502e5a4b91c42881535fba.zip"
    },
    "Description": "Checks ECS service stabilization status",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionStabilizationCheckerRole6CBA6344",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 60
   },
   "DependsOn": [
    "DLTLambdaFunctionStabilizationCheckerRole6CBA6344"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionStabilizationCheckerLambdaLogGroup42149834": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionStabilizationChecker9DA790EC"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionStartCommandRole3F343C56": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "s3:PutObject",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            {
             "Fn::GetAtt": [
              "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
              "Arn"
             ]
            },
            "/start-signal/*"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "S3StartSignalPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionStartCommand206D87C5": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/d9e8b6cdb35ca999803dd3db6b6b73fc0ef1babfb47e89b6dd3a7b3c34af07f5.zip"
    },
    "Description": "Writes S3 start marker so ECS tasks begin test execution",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "SCENARIOS_BUCKET": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "MAIN_STACK_REGION": {
       "Ref": "AWS::Region"
      },
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionStartCommandRole3F343C56",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 60
   },
   "DependsOn": [
    "DLTLambdaFunctionStartCommandRole3F343C56"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionStartCommandLambdaLogGroupB730B794": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionStartCommand206D87C5"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionRegionalSyncRole8A668DCC": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "dynamodb:UpdateItem",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "RegionalSyncPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionRegionalSyncEF230066": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/f2ba3a7fe645fe4a02db058e4eca6d9fcd382b71d799fb5d5b57922f00f00dce.zip"
    },
    "Description": "Validates all regions are READY and emits sync metric",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionRegionalSyncRole8A668DCC",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 30
   },
   "DependsOn": [
    "DLTLambdaFunctionRegionalSyncRole8A668DCC"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionRegionalSyncLambdaLogGroup303B7022": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionRegionalSyncEF230066"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskFailureHandlerRoleB2F5047C": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "dynamodb:UpdateItem",
          "dynamodb:GetItem"
         ],
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "TaskFailureHandlerPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "cloudwatch:PutMetricData",
         "Condition": {
          "StringEquals": {
           "cloudwatch:namespace": "distributed-load-testing"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "CloudWatchMetricPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK",
      "IAM_POLICYDOCUMENT_NO_WILDCARD_RESOURCE"
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskFailureHandlerCB3B514D": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/a3284b91035a950557e827367e539363eb690dccef942bf5204286958a832e98.zip"
    },
    "Description": "Handles ECS task failure events and tracks failure threshold",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionTaskFailureHandlerRoleB2F5047C",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 30
   },
   "DependsOn": [
    "DLTLambdaFunctionTaskFailureHandlerRoleB2F5047C"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionTaskFailureHandlerLambdaLogGroupE7AB6C96": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionTaskFailureHandlerCB3B514D"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionECSTaskStoppedRule2D661D34": {
   "Type": "AWS::Events::Rule",
   "Properties": {
    "Description": "Routes ECS task STOPPED events to the Task Failure Handler for threshold tracking",
    "EventPattern": {
     "source": [
      "aws.ecs"
     ],
     "detail-type": [
      "ECS Task State Change"
     ],
     "detail": {
      "lastStatus": [
       "STOPPED"
      ]
     }
    },
    "State": "ENABLED",
    "Targets": [
     {
      "Arn": {
       "Fn::GetAtt": [
        "DLTLambdaFunctionTaskFailureHandlerCB3B514D",
        "Arn"
       ]
      },
      "Id": "Target0"
     }
    ]
   }
  },
  "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.1.0/c2463582fef47f44c245ea42c36b60d52bc77cd655c04a64f750afd3458bd0dc.zip"
    },
    "Description": "Hourly scan for orphaned ECS services not associated with active tests",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "STATE_MACHINE_ARN": {
       "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionOrphanCleanupRoleB4AD3115",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 900
   },
   "DependsOn": [
    "DLTLambdaFunctionOrphanCleanupRoleB4AD3115"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionOrphanCleanupLambdaLogGroupE96F9900": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionOrphanCleanup13860457"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionOrphanCleanupScheduleRuleF6705350": {
   "Type": "AWS::Events::Rule",
   "Properties": {
    "Description": "Hourly trigger for orphaned ECS service cleanup",
    "ScheduleExpression": "rate(1 hour)",
    "State": "ENABLED",
    "Targets": [
     {
      "Arn": {
       "Fn::GetAtt": [
        "DLTLambdaFunctionOrphanCleanup13860457",
        "Arn"
       ]
      },
      "Id": "Target0"
     }
    ]
   }
  },
  "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.1.0/ab91522c563e91fcc3bf763bb21ad4c75e857e96a60d6d51095164451a2da428.zip"
    },
    "Description": "Layer 2 safety: invokes test-cleanup when step function fails",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "TEST_CLEANUP_ARN": {
       "Fn::GetAtt": [
        "DLTLambdaFunctionTestCleanupBBAA461F",
        "Arn"
       ]
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionSFNFailureHandlerRole383D70B7",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 120
   },
   "DependsOn": [
    "DLTLambdaFunctionSFNFailureHandlerRole383D70B7"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionSFNFailureHandlerLambdaLogGroup967B3D84": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionSFNFailureHandler928EB56D"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionMetricsEmitterRole7DF7406A": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    }
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionMetricsEmitterD0894A67": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/0e9e25c5bddd1d9e636b841267ee2d66a91b60b66f5858528bf9c2d38baaa82e.zip"
    },
    "Description": "Sends operational metrics for test lifecycle events",
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionMetricsEmitterRole7DF7406A",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 15
   },
   "DependsOn": [
    "DLTLambdaFunctionMetricsEmitterRole7DF7406A"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "MetricsEmitterLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionMetricsEmitterLambdaLogGroup3CB505DB": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionMetricsEmitterD0894A67"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTLambdaFunctionMetricsEmitterLogsPolicy2C69A721": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionMetricsEmitterLambdaLogGroup3CB505DB",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTLambdaFunctionMetricsEmitterLogsPolicy2C69A721",
    "Roles": [
     {
      "Ref": "DLTLambdaFunctionMetricsEmitterRole7DF7406A"
     }
    ]
   }
  },
  "DLTLambdaFunctionTestStatusUpdaterRole997B3321": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "dynamodb:GetItem",
          "dynamodb:UpdateItem"
         ],
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A",
           "Arn"
          ]
         }
        },
        {
         "Action": "dynamodb:UpdateItem",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTHistoryTable46D850CC",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "DynamoDbPolicy"
     }
    ]
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTLambdaFunctionTestStatusUpdater5E9CDE77": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/507e5ba723596bec5b972f499ae1289cab0a37ede64fe923eddd59580f184ab2.zip"
    },
    "Description": "Updates scenario and history DynamoDB records with current test status",
    "Environment": {
     "Variables": {
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "HISTORY_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC"
      }
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionTestStatusUpdaterRole997B3321",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 30
   },
   "DependsOn": [
    "DLTLambdaFunctionTestStatusUpdaterRole997B3321"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTLambdaFunctionTestStatusUpdaterLambdaLogGroup7BB4B4CD": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTLambdaFunctionTestStatusUpdater5E9CDE77"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "CLOUDWATCH_LOG_GROUP_ENCRYPTED"
     ]
    }
   }
  },
  "DLTStepFunctionStepFunctionsLogGroup8DABDAB7": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/vendedlogs/states/StepFunctionsLogGroup",
       {
        "Ref": "AWS::StackName"
       },
       {
        "Fn::GetAtt": [
         "DLTCustomResourcesCustomResourceUuidD1C03F15",
         "SUFFIX"
        ]
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W84",
       "reason": "KMS encryption unnecessary for log group"
      }
     ]
    }
   }
  },
  "DLTStepFunctionTaskRunnerStepFunctionsRoleC2237F06": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "states.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    }
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "CloudWatch logs actions do not support resource level permissions"
      },
      {
       "id": "W12",
       "reason": "CloudWatch logs actions do not support resource level permissions"
      }
     ]
    }
   }
  },
  "DLTStepFunctionTaskRunnerStepFunctionsRoleDefaultPolicy8F17B49F": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionMetricsEmitterD0894A67",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionMetricsEmitterD0894A67",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionRegionalSyncEF230066",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionRegionalSyncEF230066",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionTestStatusUpdater5E9CDE77",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionTestStatusUpdater5E9CDE77",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionResultsParserNew4A490450",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionResultsParserNew4A490450",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionStartCommand206D87C5",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionStartCommand206D87C5",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionTaskStatusCheckerNew00D99653",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionTaskStatusCheckerNew00D99653",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionTestCleanupBBAA461F",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionTestCleanupBBAA461F",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionTaskRunnerNew5AE1A3C2",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionTaskRunnerNew5AE1A3C2",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTLambdaFunctionStabilizationChecker9DA790EC",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTLambdaFunctionStabilizationChecker9DA790EC",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": [
        "logs:CreateLogDelivery",
        "logs:GetLogDelivery",
        "logs:UpdateLogDelivery",
        "logs:DeleteLogDelivery",
        "logs:ListLogDeliveries",
        "logs:PutResourcePolicy",
        "logs:DescribeResourcePolicies",
        "logs:DescribeLogGroups"
       ],
       "Effect": "Allow",
       "Resource": "*"
      },
      {
       "Action": [
        "xray:PutTraceSegments",
        "xray:PutTelemetryRecords",
        "xray:GetSamplingRules",
        "xray:GetSamplingTargets"
       ],
       "Effect": "Allow",
       "Resource": "*"
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTStepFunctionTaskRunnerStepFunctionsRoleDefaultPolicy8F17B49F",
    "Roles": [
     {
      "Ref": "DLTStepFunctionTaskRunnerStepFunctionsRoleC2237F06"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W12",
       "reason": "CloudWatch logs actions do not support resource level permissions"
      },
      {
       "id": "W76",
       "reason": "The IAM policy is written for least-privilege access."
      }
     ]
    }
   }
  },
  "DLTStepFunctionTaskRunnerStepFunctionsC295A535": {
   "Type": "AWS::StepFunctions::StateMachine",
   "Properties": {
    "DefinitionString": {
     "Fn::Join": [
      "",
      [
       "{\"StartAt\":\"TestStart\",\"States\":{\"TestStart\":{\"Next\":\"Stabilization Map\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":null,\"Next\":\"Stabilization Map\"}],\"Type\":\"Task\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionMetricsEmitterD0894A67",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"solutionId\":\"SO0062\",\"uuid\":\"",
       {
        "Fn::GetAtt": [
         "DLTCustomResourcesCustomResourceUuidD1C03F15",
         "UUID"
        ]
       },
       "\",\"version\":\"v4.1.0\",\"metricUrl\":\"https://metrics.awssolutionsbuilder.com/generic\",\"accountId\":\"",
       {
        "Ref": "AWS::AccountId"
       },
       "\",\"metricSchemaVersion\":1,\"data\":{\"Type\":\"TestStart\",\"TestId.$\":\"$.testId\",\"TestType.$\":\"$.testType\",\"FileType.$\":\"$.fileType\",\"TestDuration.$\":\"$.testDuration\",\"RegionCount.$\":\"States.ArrayLength($.testTaskConfig)\"}}}},\"Stabilization Map\":{\"Type\":\"Map\",\"ResultPath\":\"$.stabilizationResults\",\"Next\":\"Regional Sync\",\"InputPath\":\"$\",\"ItemsPath\":\"$.testTaskConfig\",\"ItemSelector\":{\"testTaskConfig.$\":\"$$.Map.Item.Value\",\"testId.$\":\"$.testId\",\"testType.$\":\"$.testType\",\"fileType.$\":\"$.fileType\",\"showLive.$\":\"$.showLive\",\"testDuration.$\":\"$.testDuration\",\"prefix.$\":\"$.prefix\",\"testRunId.$\":\"$.testRunId\",\"hubTaskDefinition.$\":\"$.hubTaskDefinition\"},\"ItemProcessor\":{\"ProcessorConfig\":{\"Mode\":\"INLINE\"},\"StartAt\":\"Check Running Tests\",\"States\":{\"Check Running Tests\":{\"Next\":\"Test already running?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.error\",\"Next\":\"Prepare Phase 1 Failure Cleanup\"}],\"Type\":\"Task\",\"InputPath\":\"$\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTaskStatusCheckerNew00D99653",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}},\"Test already running?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.isRunning\",\"BooleanEquals\":true,\"Next\":\"Test Already Running End\"}],\"Default\":\"Task Runner\"},\"Task Runner\":{\"Next\":\"Check Stabilization\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.error\",\"Next\":\"Prepare Phase 1 Failure Cleanup\"}],\"Type\":\"Task\",\"InputPath\":\"$\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTaskRunnerNew5AE1A3C2",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}},\"Check Stabilization\":{\"Next\":\"Service stable?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.error\",\"Next\":\"Prepare Phase 1 Failure Cleanup\"}],\"Type\":\"Task\",\"InputPath\":\"$\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionStabilizationChecker9DA790EC",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}},\"Wait 10s - stabilization\":{\"Type\":\"Wait\",\"Seconds\":10,\"Next\":\"Check Stabilization\"},\"Service stable?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.status\",\"StringEquals\":\"READY\",\"Next\":\"Phase 1 Map End\"},{\"Variable\":\"$.status\",\"StringEquals\":\"FAILED\",\"Next\":\"Phase 1 Map End\"}],\"Default\":\"Wait 10s - stabilization\"},\"Phase 1 Map End\":{\"Type\":\"Pass\",\"End\":true},\"Phase 1 Error Cleanup\":{\"Next\":\"Phase 1 Map End\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"InputPath\":\"$\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestCleanupBBAA461F",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}},\"Prepare Phase 1 Failure Cleanup\":{\"Type\":\"Pass\",\"Parameters\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testTaskConfig.$\":\"$.testTaskConfig\",\"finalStatus\":\"failed\",\"errorReason\":\"ECS service creation or stabilization failed\",\"skipStatusUpdate\":true},\"Next\":\"Phase 1 Error Cleanup\"},\"Test Already Running End\":{\"Type\":\"Pass\",\"Next\":\"Phase 1 Map End\"}}}},\"Regional Sync\":{\"Next\":\"All regions ready?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.error\",\"Next\":\"Cancel All Regions\"}],\"Type\":\"Task\",\"ResultPath\":\"$.syncResult\",\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionRegionalSyncEF230066",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testType.$\":\"$.testType\",\"regions.$\":\"$.stabilizationResults\"}}},\"All regions ready?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.syncResult.Payload.allReady\",\"BooleanEquals\":true,\"Next\":\"Set Status: running\"}],\"Default\":\"Cancel All Regions\"},\"Cancel All Regions\":{\"Type\":\"Map\",\"ResultPath\":null,\"Next\":\"Final Outcome: failed\",\"InputPath\":\"$\",\"ItemsPath\":\"$.stabilizationResults\",\"ItemProcessor\":{\"ProcessorConfig\":{\"Mode\":\"INLINE\"},\"StartAt\":\"Prepare Cancel Cleanup\",\"States\":{\"Prepare Cancel Cleanup\":{\"Type\":\"Pass\",\"Parameters\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testTaskConfig.$\":\"$.testTaskConfig\",\"finalStatus\":\"failed\",\"errorReason\":\"Regional sync failed — at least one region did not stabilize\",\"skipStatusUpdate\":true},\"Next\":\"Cancel Region\"},\"Cancel Region\":{\"End\":true,\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"InputPath\":\"$\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestCleanupBBAA461F",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}}}}},\"Final Outcome: failed\":{\"Type\":\"Pass\",\"Result\":\"failed\",\"ResultPath\":\"$.finalOutcome\",\"Next\":\"TestEnd\"},\"Error Cleanup Map\":{\"Type\":\"Map\",\"ResultPath\":null,\"Next\":\"Final Outcome: failed\",\"InputPath\":\"$\",\"ItemsPath\":\"$.stabilizationResults\",\"ItemProcessor\":{\"ProcessorConfig\":{\"Mode\":\"INLINE\"},\"StartAt\":\"Prepare Error Cleanup\",\"States\":{\"Prepare Error Cleanup\":{\"Type\":\"Pass\",\"Parameters\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testTaskConfig.$\":\"$.testTaskConfig\",\"finalStatus\":\"failed\",\"errorReason\":\"Results parsing failed\",\"skipStatusUpdate\":true},\"Next\":\"Invoke Error Cleanup\"},\"Invoke Error Cleanup\":{\"End\":true,\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"InputPath\":\"$\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestCleanupBBAA461F",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}}}}},\"Test results succeeded?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.executionResult.hasFailures\",\"BooleanEquals\":true,\"Next\":\"Error Cleanup Map\"},{\"Variable\":\"$.error\",\"IsPresent\":true,\"Next\":\"Error Cleanup Map\"}],\"Default\":\"Cleanup Map\"},\"Set Status: cleaning up\":{\"Next\":\"Test results succeeded?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestStatusUpdater5E9CDE77",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"status\":\"cleaning up\"}}},\"Parse Results\":{\"Next\":\"Set Status: cleaning up\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.error\",\"Next\":\"Set Status: cleaning up\"}],\"Type\":\"Task\",\"ResultPath\":\"$.parseResult\",\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionResultsParserNew4A490450",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"testTaskConfig.$\":\"$.testTaskConfig\",\"testId.$\":\"$.testId\",\"testType.$\":\"$.testType\",\"fileType.$\":\"$.fileType\",\"showLive.$\":\"$.showLive\",\"testDuration.$\":\"$.testDuration\",\"prefix.$\":\"$.prefix\",\"testRunId.$\":\"$.testRunId\",\"executionStart.$\":\"$$.Execution.StartTime\"}}},\"Set Status: parsing results\":{\"Next\":\"Parse Results\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestStatusUpdater5E9CDE77",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"status\":\"parsing results\"}}},\"Check For Failures\":{\"Type\":\"Pass\",\"ResultPath\":\"$.executionResult\",\"Parameters\":{\"hasFailures.$\":\"States.ArrayContains($.executionMapResults, 'failed')\"},\"Next\":\"Set Status: parsing results\"},\"Execution Map\":{\"Type\":\"Map\",\"ResultPath\":\"$.executionMapResults\",\"Next\":\"Check For Failures\",\"InputPath\":\"$\",\"ItemsPath\":\"$.stabilizationResults\",\"ItemProcessor\":{\"ProcessorConfig\":{\"Mode\":\"INLINE\"},\"StartAt\":\"Send START Command\",\"States\":{\"Send START Command\":{\"Next\":\"Check Completion\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.error\",\"Next\":\"Prepare Start Command Failure\"}],\"Type\":\"Task\",\"InputPath\":\"$\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionStartCommand206D87C5",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}},\"Check Completion\":{\"Next\":\"Is test complete?\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":\"$.error\",\"Next\":\"Prepare Completion Monitor Failure\"}],\"Type\":\"Task\",\"InputPath\":\"$\",\"OutputPath\":\"$.Payload\",\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTaskStatusCheckerNew00D99653",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}},\"Wait 15s - completion\":{\"Type\":\"Wait\",\"Seconds\":15,\"Next\":\"Check Completion\"},\"Is test complete?\":{\"Type\":\"Choice\",\"Choices\":[{\"Variable\":\"$.isComplete\",\"BooleanEquals\":true,\"Next\":\"Set Final Status: success\"},{\"Variable\":\"$.timedOut\",\"BooleanEquals\":true,\"Next\":\"Prepare Phase 2 Failure Cleanup\"}],\"Default\":\"Wait 15s - completion\"},\"Set Final Status: success\":{\"Type\":\"Pass\",\"Parameters\":{\"finalStatus\":\"success\"},\"Next\":\"Phase 2 Map End\"},\"Phase 2 Map End\":{\"Type\":\"Pass\",\"OutputPath\":\"$.finalStatus\",\"End\":true},\"Phase 2 Error Cleanup\":{\"Next\":\"Phase 2 Map End\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"InputPath\":\"$\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestCleanupBBAA461F",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}},\"Prepare Phase 2 Failure Cleanup\":{\"Type\":\"Pass\",\"Parameters\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testTaskConfig.$\":\"$.testTaskConfig\",\"finalStatus\":\"failed\",\"errorReason.$\":\"$.errorReason\",\"skipStatusUpdate\":true},\"Next\":\"Phase 2 Error Cleanup\"},\"Prepare Completion Monitor Failure\":{\"Type\":\"Pass\",\"Parameters\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testTaskConfig.$\":\"$.testTaskConfig\",\"finalStatus\":\"failed\",\"errorReason\":\"Completion monitoring failed\",\"skipStatusUpdate\":true},\"Next\":\"Phase 2 Error Cleanup\"},\"Prepare Start Command Failure\":{\"Type\":\"Pass\",\"Parameters\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testTaskConfig.$\":\"$.testTaskConfig\",\"finalStatus\":\"failed\",\"errorReason\":\"Failed to send start command\",\"skipStatusUpdate\":true},\"Next\":\"Phase 2 Error Cleanup\"}}}},\"Set Status: running\":{\"Next\":\"Execution Map\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestStatusUpdater5E9CDE77",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"status\":\"running\"}}},\"Cleanup Map\":{\"Type\":\"Map\",\"ResultPath\":null,\"Next\":\"Final Outcome: complete\",\"InputPath\":\"$\",\"ItemsPath\":\"$.stabilizationResults\",\"ItemProcessor\":{\"ProcessorConfig\":{\"Mode\":\"INLINE\"},\"StartAt\":\"Prepare Complete Cleanup\",\"States\":{\"Prepare Complete Cleanup\":{\"Type\":\"Pass\",\"Parameters\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"testTaskConfig.$\":\"$.testTaskConfig\",\"finalStatus\":\"complete\",\"skipStatusUpdate\":true},\"Next\":\"Invoke Test Cleanup\"},\"Invoke Test Cleanup\":{\"End\":true,\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"InputPath\":\"$\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestCleanupBBAA461F",
         "Arn"
        ]
       },
       "\",\"Payload.$\":\"$\"}}}}},\"Final Outcome: complete\":{\"Type\":\"Pass\",\"Result\":\"complete\",\"ResultPath\":\"$.finalOutcome\",\"Next\":\"TestEnd\"},\"TestEnd\":{\"Next\":\"Set Final Status and Endtime\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Catch\":[{\"ErrorEquals\":[\"States.ALL\"],\"ResultPath\":null,\"Next\":\"Set Final Status and Endtime\"}],\"Type\":\"Task\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionMetricsEmitterD0894A67",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"solutionId\":\"SO0062\",\"uuid\":\"",
       {
        "Fn::GetAtt": [
         "DLTCustomResourcesCustomResourceUuidD1C03F15",
         "UUID"
        ]
       },
       "\",\"version\":\"v4.1.0\",\"metricUrl\":\"https://metrics.awssolutionsbuilder.com/generic\",\"accountId\":\"",
       {
        "Ref": "AWS::AccountId"
       },
       "\",\"metricSchemaVersion\":1,\"data\":{\"Type\":\"TestEnd\",\"TestId.$\":\"$.testId\",\"TestType.$\":\"$.testType\",\"FinalStatus.$\":\"$.finalOutcome\"}}}},\"Set Final Status and Endtime\":{\"Next\":\"Done\",\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"ResultPath\":null,\"Resource\":\"arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":states:::lambda:invoke\",\"Parameters\":{\"FunctionName\":\"",
       {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestStatusUpdater5E9CDE77",
         "Arn"
        ]
       },
       "\",\"Payload\":{\"testId.$\":\"$.testId\",\"testRunId.$\":\"$.testRunId\",\"status.$\":\"$.finalOutcome\",\"endTime.$\":\"$$.State.EnteredTime\"}}},\"Done\":{\"Type\":\"Succeed\"}}}"
      ]
     ]
    },
    "LoggingConfiguration": {
     "Destinations": [
      {
       "CloudWatchLogsLogGroup": {
        "LogGroupArn": {
         "Fn::GetAtt": [
          "DLTStepFunctionStepFunctionsLogGroup8DABDAB7",
          "Arn"
         ]
        }
       }
      }
     ],
     "IncludeExecutionData": false,
     "Level": "ALL"
    },
    "RoleArn": {
     "Fn::GetAtt": [
      "DLTStepFunctionTaskRunnerStepFunctionsRoleC2237F06",
      "Arn"
     ]
    },
    "TracingConfiguration": {
     "Enabled": true
    }
   },
   "DependsOn": [
    "DLTStepFunctionTaskRunnerStepFunctionsRoleDefaultPolicy8F17B49F",
    "DLTStepFunctionTaskRunnerStepFunctionsRoleC2237F06"
   ],
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTSavedQueriesTestTimeline565856F1": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionTaskRunnerLambdaLogGroupF801BE82"
     },
     {
      "Ref": "DLTLambdaFunctionStabilizationCheckerLambdaLogGroup42149834"
     },
     {
      "Ref": "DLTLambdaFunctiontaskStatusCheckerLambdaLogGroup1988969D"
     },
     {
      "Ref": "DLTLambdaFunctionStartCommandLambdaLogGroupB730B794"
     },
     {
      "Ref": "DLTLambdaFunctionTestCleanupLambdaLogGroupC7B4FECA"
     },
     {
      "Ref": "DLTLambdaFunctionTaskCancellerLambdaLogGroupBD1D284E"
     },
     {
      "Ref": "DLTLambdaFunctionTaskFailureHandlerLambdaLogGroupE7AB6C96"
     },
     {
      "Ref": "DLTLambdaFunctionRegionalSyncLambdaLogGroup303B7022"
     },
     {
      "Ref": "DLTLambdaFunctionOrphanCleanupLambdaLogGroupE96F9900"
     },
     {
      "Ref": "DLTLambdaFunctionSFNFailureHandlerLambdaLogGroup967B3D84"
     },
     {
      "Ref": "DLTLambdaFunctionMetricsEmitterLambdaLogGroup3CB505DB"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       "DLT - Test Timeline [",
       {
        "Ref": "AWS::StackName"
       },
       " ",
       {
        "Ref": "AWS::Region"
       },
       "]"
      ]
     ]
    },
    "QueryString": "fields @timestamp, logEvent, message, region, error\n| filter testRunId = \"REPLACE_WITH_TEST_RUN_ID\"\n| sort @timestamp asc\n| limit 500"
   }
  },
  "DLTSavedQueriesTestErrorsFED798D2": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionTaskRunnerLambdaLogGroupF801BE82"
     },
     {
      "Ref": "DLTLambdaFunctionStabilizationCheckerLambdaLogGroup42149834"
     },
     {
      "Ref": "DLTLambdaFunctiontaskStatusCheckerLambdaLogGroup1988969D"
     },
     {
      "Ref": "DLTLambdaFunctionStartCommandLambdaLogGroupB730B794"
     },
     {
      "Ref": "DLTLambdaFunctionTestCleanupLambdaLogGroupC7B4FECA"
     },
     {
      "Ref": "DLTLambdaFunctionTaskCancellerLambdaLogGroupBD1D284E"
     },
     {
      "Ref": "DLTLambdaFunctionTaskFailureHandlerLambdaLogGroupE7AB6C96"
     },
     {
      "Ref": "DLTLambdaFunctionRegionalSyncLambdaLogGroup303B7022"
     },
     {
      "Ref": "DLTLambdaFunctionOrphanCleanupLambdaLogGroupE96F9900"
     },
     {
      "Ref": "DLTLambdaFunctionSFNFailureHandlerLambdaLogGroup967B3D84"
     },
     {
      "Ref": "DLTLambdaFunctionMetricsEmitterLambdaLogGroup3CB505DB"
     },
     {
      "Ref": "DLTEcsDLTCloudWatchLogsGroupFE9EC144"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       "DLT - Test Errors [",
       {
        "Ref": "AWS::StackName"
       },
       " ",
       {
        "Ref": "AWS::Region"
       },
       "]"
      ]
     ]
    },
    "QueryString": "fields @timestamp, logEvent, message, region, taskId, error\n| filter testRunId = \"REPLACE_WITH_TEST_RUN_ID\" and level = \"ERROR\"\n| sort @timestamp asc"
   }
  },
  "DLTSavedQueriesTaskFailuresC06FB5BD": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionTaskFailureHandlerLambdaLogGroupE7AB6C96"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       "DLT - Task Failures [",
       {
        "Ref": "AWS::StackName"
       },
       " ",
       {
        "Ref": "AWS::Region"
       },
       "]"
      ]
     ]
    },
    "QueryString": "fields @timestamp, testId, testRunId, region, taskArn, stopCode, exitCode, stopCategory, stoppedReason\n| filter logEvent = \"TASK_FAILURE_DETECTED\"\n| sort @timestamp desc\n| limit 50"
   }
  },
  "DLTSavedQueriesOrphanCleanup80C351CE": {
   "Type": "AWS::Logs::QueryDefinition",
   "Properties": {
    "LogGroupNames": [
     {
      "Ref": "DLTLambdaFunctionOrphanCleanupLambdaLogGroupE96F9900"
     }
    ],
    "Name": {
     "Fn::Join": [
      "",
      [
       "DLT - Orphan Cleanup [",
       {
        "Ref": "AWS::StackName"
       },
       " ",
       {
        "Ref": "AWS::Region"
       },
       "]"
      ]
     ]
    },
    "QueryString": "fields @timestamp, logEvent, message, region, cluster, orphanCount, orphanTestIds\n| filter logEvent = \"ORPHAN_DETECTED\"\n| sort @timestamp desc\n| limit 50"
   }
  },
  "TaskCancelerSfnPolicyF898DBC2": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "states:ListExecutions",
       "Effect": "Allow",
       "Resource": {
        "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
       }
      },
      {
       "Action": [
        "states:DescribeExecution",
        "states:StopExecution"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":states:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":execution:",
          {
           "Fn::GetAtt": [
            "DLTStepFunctionTaskRunnerStepFunctionsC295A535",
            "Name"
           ]
          },
          ":*"
         ]
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "TaskCancelerSfnPolicyF898DBC2",
    "Roles": [
     {
      "Ref": "DLTLambdaFunctionLambdaTaskCancelerRoleAE2C84CF"
     }
    ]
   }
  },
  "SFNFailureHandlerSfnPolicy01B40EFA": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "states:DescribeExecution",
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":states:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":execution:",
          {
           "Fn::GetAtt": [
            "DLTStepFunctionTaskRunnerStepFunctionsC295A535",
            "Name"
           ]
          },
          ":*"
         ]
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "SFNFailureHandlerSfnPolicy01B40EFA",
    "Roles": [
     {
      "Ref": "DLTLambdaFunctionSFNFailureHandlerRole383D70B7"
     }
    ]
   }
  },
  "OrphanCleanupSfnPolicy9066FEBC": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "states:ListExecutions",
       "Effect": "Allow",
       "Resource": {
        "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "OrphanCleanupSfnPolicy9066FEBC",
    "Roles": [
     {
      "Ref": "DLTLambdaFunctionOrphanCleanupRoleB4AD3115"
     }
    ]
   }
  },
  "SFNFailureRule770B04D7": {
   "Type": "AWS::Events::Rule",
   "Properties": {
    "Description": "Routes Step Function execution failures to the SFN Failure Handler for ECS cleanup",
    "EventPattern": {
     "source": [
      "aws.states"
     ],
     "detail-type": [
      "Step Functions Execution Status Change"
     ],
     "detail": {
      "status": [
       "FAILED",
       "TIMED_OUT",
       "ABORTED"
      ],
      "stateMachineArn": [
       {
        "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
       }
      ]
     }
    },
    "State": "ENABLED",
    "Targets": [
     {
      "Arn": {
       "Fn::GetAtt": [
        "DLTLambdaFunctionSFNFailureHandler928EB56D",
        "Arn"
       ]
      },
      "Id": "Target0"
     }
    ]
   }
  },
  "SFNFailureRuleAllowEventRuledistributedloadtestingonawsDLTLambdaFunctionSFNFailureHandlerDC8BE757C36A7BBD": {
   "Type": "AWS::Lambda::Permission",
   "Properties": {
    "Action": "lambda:InvokeFunction",
    "FunctionName": {
     "Fn::GetAtt": [
      "DLTLambdaFunctionSFNFailureHandler928EB56D",
      "Arn"
     ]
    },
    "Principal": "events.amazonaws.com",
    "SourceArn": {
     "Fn::GetAtt": [
      "SFNFailureRule770B04D7",
      "Arn"
     ]
    }
   }
  },
  "DLTApiDLTAPIServicesLambdaRole4465EAA4": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "ecs:ListTasks",
          "ecs:RunTask",
          "ecs:DescribeTasks",
          "ecs:TagResource",
          "logs:DeleteMetricFilter"
         ],
         "Condition": {
          "StringEquals": {
           "aws:ResourceTag/SolutionId": "SO0062"
          }
         },
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": "iam:PassRole",
         "Condition": {
          "StringEquals": {
           "iam:PassedToService": "ecs-tasks.amazonaws.com"
          }
         },
         "Effect": "Allow",
         "Resource": [
          {
           "Fn::GetAtt": [
            "DLTEcsDLTTaskExecutionRoleDE668717",
            "Arn"
           ]
          },
          {
           "Fn::GetAtt": [
            "DLTEcsDLTTaskRoleD37E29C5",
            "Arn"
           ]
          }
         ]
        },
        {
         "Action": "states:StartExecution",
         "Effect": "Allow",
         "Resource": {
          "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
         }
        },
        {
         "Action": "cloudwatch:DeleteDashboards",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":cloudwatch::",
            {
             "Ref": "AWS::AccountId"
            },
            ":dashboard/EcsLoadTesting*"
           ]
          ]
         }
        },
        {
         "Action": [
          "cloudformation:ListExports",
          "cloudformation:DescribeStacks"
         ],
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": [
          "ecs:ListAccountSettings",
          "ecs:ListTasks",
          "ecs:ListClusters",
          "ecs:DescribeTasks",
          "ecs:DescribeClusters",
          "ecs:DescribeTaskDefinition",
          "ecs:DescribeServices"
         ],
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": "servicequotas:GetServiceQuota",
         "Effect": "Allow",
         "Resource": "*"
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "DLTAPIServicesLambdaPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "ecs:ListTasks and cloudformation:ListExports do not support resource level permissions"
      },
      {
       "id": "F10",
       "reason": "requires in-line role permissions."
      }
     ]
    }
   }
  },
  "DLTApiLambdaApiEventsPolicy63BB60C8": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "events:PutTargets",
        "events:PutRule",
        "events:DeleteRule",
        "events:RemoveTargets"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":events:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":rule/*Scheduled"
          ]
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":events:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":rule/*Create"
          ]
         ]
        }
       ]
      },
      {
       "Action": "events:ListRules",
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":events:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":rule/*"
         ]
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTApiLambdaApiEventsPolicy63BB60C8",
    "Roles": [
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   }
  },
  "DLTApiSchedulerExecutionRole2AB7362D": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "scheduler.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    }
   },
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "IAM_NO_INLINE_POLICY_CHECK"
     ]
    }
   }
  },
  "DLTApiLambdaApiSchedulerPolicy392E0831": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "scheduler:CreateSchedule",
        "scheduler:DeleteSchedule",
        "scheduler:GetSchedule"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":scheduler:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":schedule/default/*Create"
          ]
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           "arn:",
           {
            "Ref": "AWS::Partition"
           },
           ":scheduler:",
           {
            "Ref": "AWS::Region"
           },
           ":",
           {
            "Ref": "AWS::AccountId"
           },
           ":schedule/default/*Scheduled"
          ]
         ]
        }
       ]
      },
      {
       "Action": "iam:PassRole",
       "Condition": {
        "StringEquals": {
         "iam:PassedToService": "scheduler.amazonaws.com"
        }
       },
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTApiSchedulerExecutionRole2AB7362D",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTApiLambdaApiSchedulerPolicy392E0831",
    "Roles": [
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   }
  },
  "DLTApiDLTAPIServicesLambdaNewF30B7DE0": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/bb09c10ad46465e598c00497293e21756abeb558e7c3116567db54deb44d98dd.zip"
    },
    "Description": "API microservices for creating, updating, listing and deleting test scenarios",
    "Environment": {
     "Variables": {
      "HISTORY_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTHistoryTable46D850CC"
      },
      "HISTORY_TABLE_GSI_NAME": "testId-startTime-index",
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic",
      "SCENARIOS_BUCKET": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "SCENARIOS_TABLE": {
       "Ref": "DLTTestRunnerStorageDLTScenariosTableAB6F5C2A"
      },
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      },
      "SOLUTION_ID": "SO0062",
      "STACK_ID": {
       "Ref": "AWS::StackId"
      },
      "STACK_NAME": {
       "Ref": "AWS::StackName"
      },
      "STATE_MACHINE_ARN": {
       "Ref": "DLTStepFunctionTaskRunnerStepFunctionsC295A535"
      },
      "TASK_CANCELER_ARN": {
       "Fn::GetAtt": [
        "DLTLambdaFunctionTaskCancelerNewA6986F4A",
        "Arn"
       ]
      },
      "SCHEDULER_ROLE_ARN": {
       "Fn::GetAtt": [
        "DLTApiSchedulerExecutionRole2AB7362D",
        "Arn"
       ]
      },
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "VERSION": "v4.1.0",
      "MIN_COMPATIBLE_VERSION": "4.1.0"
     }
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTApiDLTAPIServicesLambdaRole4465EAA4",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 120
   },
   "DependsOn": [
    "DLTApiDLTAPIServicesLambdaRole4465EAA4"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "VPC not needed for lambda"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "DLTApiDLTAPIServicesLambdaNewDLTApiInvokePermission9CFC1132": {
   "Type": "AWS::Lambda::Permission",
   "Properties": {
    "Action": "lambda:InvokeFunction",
    "FunctionName": {
     "Fn::GetAtt": [
      "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
      "Arn"
     ]
    },
    "Principal": "apigateway.amazonaws.com",
    "SourceArn": {
     "Fn::Join": [
      "",
      [
       "arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":execute-api:",
       {
        "Ref": "AWS::Region"
       },
       ":",
       {
        "Ref": "AWS::AccountId"
       },
       ":",
       {
        "Ref": "DLTApi0C903EB5"
       },
       "/*"
      ]
     ]
    }
   }
  },
  "DLTApiSchedulerInvokeLambdaPolicy5D66B0FC": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTApiSchedulerInvokeLambdaPolicy5D66B0FC",
    "Roles": [
     {
      "Ref": "DLTApiSchedulerExecutionRole2AB7362D"
     }
    ]
   }
  },
  "DLTApidltApiServicesLambdaLogGroup54338B12": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "LogGroupName": {
     "Fn::Join": [
      "",
      [
       "/aws/lambda/",
       {
        "Ref": "DLTApiDLTAPIServicesLambdaNewF30B7DE0"
       }
      ]
     ]
    },
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W84",
       "reason": "KMS encryption unnecessary for log group"
      }
     ]
    }
   }
  },
  "DLTApiLambdaApiPermissionPolicyE12EEC7D": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "lambda:AddPermission",
        "lambda:RemovePermission"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTApiLambdaApiPermissionPolicyE12EEC7D",
    "Roles": [
     {
      "Ref": "DLTApiDLTAPIServicesLambdaRole4465EAA4"
     }
    ]
   }
  },
  "DLTApiAPILogsF7751EF3": {
   "Type": "AWS::Logs::LogGroup",
   "Properties": {
    "RetentionInDays": 3653
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W84",
       "reason": "KMS encryption unnecessary for log group"
      }
     ]
    }
   }
  },
  "DLTApiAPILoggingRole119E64B1": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "apigateway.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": [
          "logs:CreateLogGroup",
          "logs:CreateLogStream",
          "logs:DescribeLogGroups",
          "logs:DescribeLogStreams",
          "logs:PutLogEvents",
          "logs:GetLogEvents",
          "logs:FilterLogEvent"
         ],
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":logs:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":*"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "apiLoggingPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "F10",
       "reason": "Requires inline policy resources."
      }
     ]
    }
   }
  },
  "DLTApi0C903EB5": {
   "Type": "AWS::ApiGateway::RestApi",
   "Properties": {
    "Description": "Distributed Load Testing API - version v4.1.0",
    "EndpointConfiguration": {
     "Types": [
      {
       "Fn::If": [
        "DLTApiIsGovCloudPartition6BAD7D2E",
        "REGIONAL",
        "EDGE"
       ]
      }
     ]
    },
    "Name": "DLTApi"
   }
  },
  "DLTApiCloudWatchRoleD45E4DD6": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "apigateway.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "ManagedPolicyArns": [
     {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs"
       ]
      ]
     }
    ]
   },
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain"
  },
  "DLTApiAccount80CB63FF": {
   "Type": "AWS::ApiGateway::Account",
   "Properties": {
    "CloudWatchRoleArn": {
     "Fn::GetAtt": [
      "DLTApiCloudWatchRoleD45E4DD6",
      "Arn"
     ]
    }
   },
   "DependsOn": [
    "DLTApi0C903EB5"
   ],
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain"
  },
  "DLTApiDeployment098FF88848a44a4e9bf4d862b2f6429800d985af": {
   "Type": "AWS::ApiGateway::Deployment",
   "Properties": {
    "Description": "Distributed Load Testing API - version v4.1.0",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   },
   "DependsOn": [
    "DLTApiAPIAllRequestValidator02C9D47F",
    "DLTApiOPTIONS823B5F09",
    "DLTApiregionsANY2B8B3A61",
    "DLTApiregionsOPTIONSCB04B2B1",
    "DLTApiregionsC4EF9783",
    "DLTApiscenariostestIdANY993028D3",
    "DLTApiscenariostestIdbaselineDELETEF89F45B6",
    "DLTApiscenariostestIdbaselineGETEBD92F32",
    "DLTApiscenariostestIdbaselineOPTIONS18BF10ED",
    "DLTApiscenariostestIdbaselinePUT9B6A0CA8",
    "DLTApiscenariostestIdbaseline90D9E1E4",
    "DLTApiscenariostestIdOPTIONS0B339CE6",
    "DLTApiscenariostestId4C170989",
    "DLTApiscenariostestIdtestrunstestRunIdANYD6143F4D",
    "DLTApiscenariostestIdtestrunstestRunIdOPTIONSA0C3B203",
    "DLTApiscenariostestIdtestrunstestRunIdFE2B5E0B",
    "DLTApiscenariostestIdtestrunsANYA16D2CF8",
    "DLTApiscenariostestIdtestrunsOPTIONS12382689",
    "DLTApiscenariostestIdtestrunsA1B93897",
    "DLTApiscenariosANYDEF83622",
    "DLTApiscenariosOPTIONS6F514DA3",
    "DLTApiscenariosB6B76329",
    "DLTApistackinfoANY0BE2837B",
    "DLTApistackinfoOPTIONS883B8130",
    "DLTApistackinfo48B763A5",
    "DLTApitasksANY60403A44",
    "DLTApitasksOPTIONSDABED809",
    "DLTApitasks0A512C83",
    "DLTApivCPUDetailsANY4E680392",
    "DLTApivCPUDetailsOPTIONS8854EB1F",
    "DLTApivCPUDetailsABB0980D"
   ],
   "Metadata": {
    "aws:cdk:do-not-refactor": true,
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W68",
       "reason": "The solution does not require the usage plan."
      }
     ]
    }
   }
  },
  "DLTApiDeploymentStageprodC81F8DCB": {
   "Type": "AWS::ApiGateway::Stage",
   "Properties": {
    "AccessLogSetting": {
     "DestinationArn": {
      "Fn::GetAtt": [
       "DLTApiAPILogsF7751EF3",
       "Arn"
      ]
     },
     "Format": "{\"extendedRequestId\":\"$context.extendedRequestId\",\"ip\":\"$context.identity.sourceIp\",\"caller\":\"$context.identity.caller\",\"user\":\"$context.identity.user\",\"userAgent\":\"$context.identity.userAgent\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\"}"
    },
    "DeploymentId": {
     "Ref": "DLTApiDeployment098FF88848a44a4e9bf4d862b2f6429800d985af"
    },
    "MethodSettings": [
     {
      "DataTraceEnabled": false,
      "HttpMethod": "*",
      "LoggingLevel": "INFO",
      "ResourcePath": "/*"
     }
    ],
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    },
    "StageName": "prod",
    "TracingEnabled": true
   },
   "DependsOn": [
    "DLTApiAccount80CB63FF"
   ],
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "API_GW_CACHE_ENABLED_AND_ENCRYPTED"
     ]
    },
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W64",
       "reason": "The solution does not require the usage plan."
      }
     ]
    }
   }
  },
  "DLTApiOPTIONS823B5F09": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'",
        "method.response.header.Access-Control-Allow-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Fn::GetAtt": [
      "DLTApi0C903EB5",
      "RootResourceId"
     ]
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiregionsC4EF9783": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Fn::GetAtt": [
      "DLTApi0C903EB5",
      "RootResourceId"
     ]
    },
    "PathPart": "regions",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiregionsOPTIONSCB04B2B1": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'",
        "method.response.header.Access-Control-Allow-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApiregionsC4EF9783"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiregionsANY2B8B3A61": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiregionsC4EF9783"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariosB6B76329": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Fn::GetAtt": [
      "DLTApi0C903EB5",
      "RootResourceId"
     ]
    },
    "PathPart": "scenarios",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariosOPTIONS6F514DA3": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'",
        "method.response.header.Access-Control-Allow-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApiscenariosB6B76329"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariosANYDEF83622": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiscenariosB6B76329"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestId4C170989": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Ref": "DLTApiscenariosB6B76329"
    },
    "PathPart": "{testId}",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdOPTIONS0B339CE6": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'",
        "method.response.header.Access-Control-Allow-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApiscenariostestId4C170989"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdANY993028D3": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiscenariostestId4C170989"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunsA1B93897": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Ref": "DLTApiscenariostestId4C170989"
    },
    "PathPart": "testruns",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunsOPTIONS12382689": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'",
        "method.response.header.Access-Control-Allow-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdtestrunsA1B93897"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunsANYA16D2CF8": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdtestrunsA1B93897"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdFE2B5E0B": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Ref": "DLTApiscenariostestIdtestrunsA1B93897"
    },
    "PathPart": "{testRunId}",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdOPTIONSA0C3B203": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'",
        "method.response.header.Access-Control-Allow-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdtestrunstestRunIdFE2B5E0B"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdtestrunstestRunIdANYD6143F4D": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdtestrunstestRunIdFE2B5E0B"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdbaseline90D9E1E4": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Ref": "DLTApiscenariostestId4C170989"
    },
    "PathPart": "baseline",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdbaselineOPTIONS18BF10ED": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'",
        "method.response.header.Access-Control-Allow-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdbaseline90D9E1E4"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdbaselineGETEBD92F32": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "GET",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdbaseline90D9E1E4"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdbaselinePUT9B6A0CA8": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "PUT",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdbaseline90D9E1E4"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiscenariostestIdbaselineDELETEF89F45B6": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "DELETE",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApiscenariostestIdbaseline90D9E1E4"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApitasks0A512C83": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Fn::GetAtt": [
      "DLTApi0C903EB5",
      "RootResourceId"
     ]
    },
    "PathPart": "tasks",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApitasksOPTIONSDABED809": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'",
        "method.response.header.Access-Control-Allow-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApitasks0A512C83"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApitasksANY60403A44": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApitasks0A512C83"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApivCPUDetailsABB0980D": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Fn::GetAtt": [
      "DLTApi0C903EB5",
      "RootResourceId"
     ]
    },
    "PathPart": "vCPUDetails",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApivCPUDetailsOPTIONS8854EB1F": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'",
        "method.response.header.Access-Control-Allow-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApivCPUDetailsABB0980D"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApivCPUDetailsANY4E680392": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApivCPUDetailsABB0980D"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApistackinfo48B763A5": {
   "Type": "AWS::ApiGateway::Resource",
   "Properties": {
    "ParentId": {
     "Fn::GetAtt": [
      "DLTApi0C903EB5",
      "RootResourceId"
     ]
    },
    "PathPart": "stack-info",
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApistackinfoOPTIONS883B8130": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "ApiKeyRequired": false,
    "AuthorizationType": "NONE",
    "HttpMethod": "OPTIONS",
    "Integration": {
     "IntegrationResponses": [
      {
       "ResponseParameters": {
        "method.response.header.Access-Control-Allow-Headers": "'Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key'",
        "method.response.header.Access-Control-Allow-Origin": "'*'",
        "method.response.header.Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
       },
       "StatusCode": "200"
      }
     ],
     "RequestTemplates": {
      "application/json": "{ statusCode: 200 }"
     },
     "Type": "MOCK"
    },
    "MethodResponses": [
     {
      "ResponseParameters": {
       "method.response.header.Access-Control-Allow-Headers": true,
       "method.response.header.Access-Control-Allow-Origin": true,
       "method.response.header.Access-Control-Allow-Methods": true
      },
      "StatusCode": "200"
     }
    ],
    "ResourceId": {
     "Ref": "DLTApistackinfo48B763A5"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApistackinfoANY0BE2837B": {
   "Type": "AWS::ApiGateway::Method",
   "Properties": {
    "AuthorizationType": "AWS_IAM",
    "HttpMethod": "ANY",
    "Integration": {
     "ContentHandling": "CONVERT_TO_TEXT",
     "IntegrationHttpMethod": "POST",
     "IntegrationResponses": [
      {
       "StatusCode": "200"
      }
     ],
     "PassthroughBehavior": "WHEN_NO_MATCH",
     "Type": "AWS_PROXY",
     "Uri": {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":apigateway:",
        {
         "Ref": "AWS::Region"
        },
        ":lambda:path/2015-03-31/functions/",
        {
         "Fn::GetAtt": [
          "DLTApiDLTAPIServicesLambdaNewF30B7DE0",
          "Arn"
         ]
        },
        "/invocations"
       ]
      ]
     }
    },
    "MethodResponses": [
     {
      "ResponseModels": {
       "application/json": "Empty"
      },
      "StatusCode": "200"
     }
    ],
    "RequestValidatorId": {
     "Ref": "DLTApiAPIAllRequestValidator02C9D47F"
    },
    "ResourceId": {
     "Ref": "DLTApistackinfo48B763A5"
    },
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    }
   }
  },
  "DLTApiApiAccountConfigBF306CC3": {
   "Type": "AWS::ApiGateway::Account",
   "Properties": {
    "CloudWatchRoleArn": {
     "Fn::GetAtt": [
      "DLTApiAPILoggingRole119E64B1",
      "Arn"
     ]
    }
   },
   "DependsOn": [
    "DLTApi0C903EB5"
   ]
  },
  "DLTApiAPIAllRequestValidator02C9D47F": {
   "Type": "AWS::ApiGateway::RequestValidator",
   "Properties": {
    "RestApiId": {
     "Ref": "DLTApi0C903EB5"
    },
    "ValidateRequestBody": true,
    "ValidateRequestParameters": true
   }
  },
  "DLTCognitoAuthIoTPolicyB8FDFE53": {
   "Type": "AWS::IoT::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "iot:Connect",
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":iot:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":client/*"
         ]
        ]
       }
      },
      {
       "Action": "iot:Subscribe",
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":iot:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":topicfilter/dlt/*"
         ]
        ]
       }
      },
      {
       "Action": "iot:Receive",
       "Effect": "Allow",
       "Resource": {
        "Fn::Join": [
         "",
         [
          "arn:",
          {
           "Ref": "AWS::Partition"
          },
          ":iot:",
          {
           "Ref": "AWS::Region"
          },
          ":",
          {
           "Ref": "AWS::AccountId"
          },
          ":topic/dlt/*"
         ]
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    }
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "Cannot specify the resource to attach policy to identity"
      }
     ]
    }
   }
  },
  "DLTCognitoAuthDLTUserPoolFA41A712": {
   "Type": "AWS::Cognito::UserPool",
   "Properties": {
    "AccountRecoverySetting": {
     "RecoveryMechanisms": [
      {
       "Name": "verified_phone_number",
       "Priority": 1
      },
      {
       "Name": "verified_email",
       "Priority": 2
      }
     ]
    },
    "AdminCreateUserConfig": {
     "AllowAdminCreateUserOnly": true,
     "InviteMessageTemplate": {
      "EmailMessage": {
       "Fn::Join": [
        "",
        [
         "\n                <p>\n                   Please use the credentials below to login to the Distributed Load Testing console.\n                </p>\n                <p>\n                    Username: <strong>{username}</strong>\n                </p>\n                <p>\n                    Password: <strong>{####}</strong>\n                </p>\n                <p>\n                    Console: <strong>https://",
         {
          "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:7521/callback",
     "http://localhost:3000/callback"
    ],
    "ClientName": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       "-userpool-client"
      ]
     ]
    },
    "EnableTokenRevocation": true,
    "ExplicitAuthFlows": [
     "ALLOW_USER_SRP_AUTH"
    ],
    "GenerateSecret": false,
    "LogoutURLs": [
     {
      "Fn::Join": [
       "",
       [
        "https://",
        {
         "Fn::GetAtt": [
          "DLTConsoleResourcesDLTDashboardS3CloudFrontDistribution1F11B8BB",
          "DomainName"
         ]
        }
       ]
      ]
     },
     {
      "Fn::Join": [
       "",
       [
        "https://",
        {
         "Fn::GetAtt": [
          "DLTConsoleResourcesDLTDashboardS3CloudFrontDistribution1F11B8BB",
          "DomainName"
         ]
        },
        "/"
       ]
      ]
     },
     "http://localhost:3000",
     "http://localhost:3000/",
     "http://localhost:7521/callback",
     "http://localhost:3000/callback"
    ],
    "RefreshTokenRotation": {
     "Feature": "ENABLED",
     "RetryGracePeriodSeconds": 60
    },
    "RefreshTokenValidity": 1440,
    "SupportedIdentityProviders": [
     "COGNITO"
    ],
    "TokenValidityUnits": {
     "RefreshToken": "minutes"
    },
    "UserPoolId": {
     "Ref": "DLTCognitoAuthDLTUserPoolFA41A712"
    },
    "WriteAttributes": [
     "address",
     "email",
     "phone_number"
    ]
   }
  },
  "DLTCognitoAuthCognitoHostedUiLambdaServiceRole397F7BE5": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "ManagedPolicyArns": [
     {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
       ]
      ]
     }
    ]
   }
  },
  "DLTCognitoAuthCognitoHostedUiLambdaServiceRoleDefaultPolicy65EE264C": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "cognito-idp:SetUICustomization",
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTCognitoAuthDLTUserPoolFA41A712",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTCognitoAuthCognitoHostedUiLambdaServiceRoleDefaultPolicy65EE264C",
    "Roles": [
     {
      "Ref": "DLTCognitoAuthCognitoHostedUiLambdaServiceRole397F7BE5"
     }
    ]
   }
  },
  "DLTCognitoAuthCognitoHostedUiLambda98AEA750": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/874f015853d8cacd9be9a6d5287fd8b7fbaa4162c59e9240f1d75fdde1ac6436.zip"
    },
    "Handler": "index.handler",
    "Role": {
     "Fn::GetAtt": [
      "DLTCognitoAuthCognitoHostedUiLambdaServiceRole397F7BE5",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 300
   },
   "DependsOn": [
    "DLTCognitoAuthCognitoHostedUiLambdaServiceRoleDefaultPolicy65EE264C",
    "DLTCognitoAuthCognitoHostedUiLambdaServiceRole397F7BE5"
   ],
   "Metadata": {
    "guard": {
     "SuppressedRules": [
      "LAMBDA_INSIDE_VPC",
      "LAMBDA_CONCURRENCY_CHECK"
     ]
    }
   }
  },
  "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventServiceRole701715C4": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "ManagedPolicyArns": [
     {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
       ]
      ]
     }
    ]
   }
  },
  "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventServiceRoleDefaultPolicy9768F7DA": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": "lambda:InvokeFunction",
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "DLTCognitoAuthCognitoHostedUiLambda98AEA750",
          "Arn"
         ]
        },
        {
         "Fn::Join": [
          "",
          [
           {
            "Fn::GetAtt": [
             "DLTCognitoAuthCognitoHostedUiLambda98AEA750",
             "Arn"
            ]
           },
           ":*"
          ]
         ]
        }
       ]
      },
      {
       "Action": "lambda:GetFunction",
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTCognitoAuthCognitoHostedUiLambda98AEA750",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventServiceRoleDefaultPolicy9768F7DA",
    "Roles": [
     {
      "Ref": "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventServiceRole701715C4"
     }
    ]
   }
  },
  "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventEBA8BB49": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/07a90cc3efdfc34da22208dcd9d211f06f5b0e01b21e778edc7c3966b1f61d57.zip"
    },
    "Description": "AWS CDK resource provider framework - onEvent (distributed-load-testing-on-aws/DLTCognitoAuth/CognitoHostedUiProvider)",
    "Environment": {
     "Variables": {
      "USER_ON_EVENT_FUNCTION_ARN": {
       "Fn::GetAtt": [
        "DLTCognitoAuthCognitoHostedUiLambda98AEA750",
        "Arn"
       ]
      }
     }
    },
    "Handler": "framework.onEvent",
    "LoggingConfig": {
     "ApplicationLogLevel": "FATAL",
     "LogFormat": "JSON"
    },
    "Role": {
     "Fn::GetAtt": [
      "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventServiceRole701715C4",
      "Arn"
     ]
    },
    "Runtime": "nodejs22.x",
    "Timeout": 900
   },
   "DependsOn": [
    "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventServiceRoleDefaultPolicy9768F7DA",
    "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventServiceRole701715C4"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W89",
       "reason": "Lambda function for Cognito UI customization does not need to be in a VPC"
      },
      {
       "id": "W92",
       "reason": "Lambda function for Cognito UI customization does not need reserved concurrency"
      }
     ]
    }
   }
  },
  "DLTCognitoAuthCognitoUICustomization6480C5AD": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "DLTCognitoAuthCognitoHostedUiProviderframeworkonEventEBA8BB49",
      "Arn"
     ]
    },
    "UserPoolId": {
     "Ref": "DLTCognitoAuthDLTUserPoolFA41A712"
    },
    "CSS": ".banner-customizable { background-color: #232f3e; padding: 25px 0px; } .logo-customizable { max-width: 350px; max-height: 80px; } .submitButton-customizable { background-color: #ec7211; } .submitButton-customizable:hover { background-color: #eb5f07; }",
    "ImageFileBase64": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAA8CAYAAABIFuztAAAABmJLR0QA/wD/AP+gvaeTAAASyUlEQVR4nO2deZwV1ZXHf4edFoNAEBQQxSURxQR0MC7j4KiEfFxiHBNHE+KCyugnjtHoiNExJtFojKJRx7jE+HFJjOA6TqIDGAWFAJooYUCCoGwCyqbQ7E3/5o9zizp1u97r97r7ddPJ+X4+/aHq3nNv3aq67y5nKQDHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHcRzHaWKkuS9Isi+Az+dk1QDYAOAjEVlWpPwBAPYNpwtF5IMmb2QJkPwsgC+G0zUi8nZI3xPAYSF9tYi80xLta2pI9gTwhXC6836LyLcF0N8kLRaRHZVqX1NC8lAAvcPpXBFZXqJsKWwRkTca077GQvKfALQPp1NEZFtLtmdXhmQVgKNN0iwRWRXJ9AdwYDhdLyIzo3wBcIJJqhaR6ZFMWwDHm6RpIrLJ5HcLdewDYHcA1QD+D8BkEdnSkHtrlZC8hPWziOQVJNvklL/VyF3fBO3pR/KJBpQ7xbTjZZP+NZP+YmPbV2JbDib5iwpf4zRzX78vQX7P6J2WM8i2KCQfN+0+vwzZUmi2BQ/JA0g+nJO+xrSnV3O1pzVC8sLo/d2ZI/NVk7+aOmHY/MOiOjaR7BjJfMHkb07ySbYn+TOS2wr0pzUkL67sUyhMnQF6F6E/gLEAniPZrhIXINmG5A0A5gE4qxLXqDQkq0jeBWAWgJNauj3OrgHJDiRvha5QT2np9rRyLozOv02yU5T2BgCG4x5IdyMJJ0bnnQEMjdK+ZI5nisjWcHwfgKuQ7hhjugN4gOS/FcivKBUZnMtgIYDbAHQC0BXAZwAMR6oCOg3A9QBuNGUmm+Npjbh2FYAfhuOaBpRfAOCn4Xh+I9rRGPYDcHkLXdtRfgXg9SjtXqQ/+FsALDJ5G5qhTb0BXFMk/+fQ/g8AGyvfnNYJVT15ZJTcHcCZAHZqLURkDcm5AA4JSV9CdkyIJxAAGIZsv7ETyORw/c8DGBXSaqB96UUA6wEcBOAnAA4N+beQfFRENpdyb60WZlVYdXTBYWfwCyOzgWT3Mq/RkWR/kr2pusU8mS7mGttLqLMTyX1JdqhHLleFRbIvVV3WZLs+koeYay2oR/azJAeQ/EyJdXcP8slWukVUWCS7hnZ0K1G+Lcm9Q5l6+w1JMe9GQlrJKqwCdW425eOVZiy7W2hrSaok0w97MVKVGJl9zPU/Krf9UV0dw/V6liDbgeR+VPtgk2D6YdcGlO0d2t6ghTLJO81zXGSOp+TI2jHrPpPegWR1SLdqqFei8u+avJNC2nkm7emca+5PstbIDGvIfbYqWM8EEmSqmNXTnm/yfkBybfj7Xk7d86OHup3kcyQPM3KjSa5jlqTO3YLMqnA+heQ/m/Z8QnIoyS+bMk+bujMTCNVW8p5JW0Hyu6yrJ51s6vtilPcdk/eTkHYTyU9NvTtC/oKo7CkkZ0Vy06iG1LxnP4Tk6+YZbqT+kL5u6qjoBEKdBK6gvkvLLJLfKlDmcySfpr5vywckr2a+PW00yWVGdhHJb7AZJhCq3ep3UXsXhjbFfaMNyatIvh/d21aSvyV5oJEdQ+2jCbXUfrHSyCxk2p96mvTpIe1D6sT2c+oCLmFm3v1Qf693Mx0oSe3PA6m/geRapS4COpD8PrODdi3JN0l+LUf+AnONkSRPJjnXlF1L8gaWsXijTpyrTR3HhOedMDCSP8fk/dmkH2fSnwxtIY0dhDpJJr+3bUzHoG+bsstpxjBT/zeov82v8O/BnsUSJpAg96yRe9Ck5xrRSf4Hi7OW4YdG8vIicl2CTE04X8ZsR9pIcneWZkT/mDpg53F7dL9vm7wjoryrTN6dIe2OAvWuNuUuYnYytWwneWZ0nSHMDgKWFea4YhMI9Yc7qUAbEu6nGWSpO4jl9ZS5KrrOfxaQqyW50pw3+QRCcjCzg3zM3ZH8rUVkGe597yB7YwGZraa+XCM600F3C8nXCtSzjtlJp10R2VUkF5jzUnaEXagTWTFuicrYMWUiC/f5K8t4h2eZcjNC2nMm7a5Ivp/J2850EviRST+P5DPm/LggM8KkTTd19mV20tpBnZjHUPtQs3vRxuyqRnQAsN4qfYsJhgc5Jpx+CGAI1K7SB6mushuAS8LxWwCsN0Ut1J7xUwCxS2OfUHYcgMcAPCUipeqxe0LtPF+F6jgfNHlXMtpplMkfAFgPm0+g7b8bAEjuB+AeqKv2dqhOfAiAfwewGWr/eojZVeH9AHYLx38FcCqAowA8gvJcVRvDj5G6PG4BcBOAc6B2hdqQPhqANRpeAWCvcPwU9D4Ph95Pwk5HCaor+A9M3q+hrponA5gLoGIrOeoq+NdQmx+gfWoogNOR2kouI3lCkK9CaueaD9V5d4S6sr8Q0vcCcEE4ngrAeuRtgvaLzIKlHjoCOAbA96Gu2+dC3wUA7IGsYf4iAMludguAK6HP/hIAHQDsX8Z1AeAupHaHDQBugL7/XyE1VI8hWcjx5USoDeH4UI9dpI4sox2jzPHj4d/HbF0kOycnIrIU6ftrByBZBFr7x6TwlzAs/GvtHzvVYyGcwfbTNgCOg9pC/gxgJcl7SR5U/+38jcDSdyB25p5q0uvsQEh2NmmrSZ6RvFyqDn04o+0d67GBMN2BkNFqI+SXsgOpIfm5qNyrJv9nJr2sHUhIL2gDoaq4EuIVrX22o0PaQfZ5UAdZW2aaya/IDoT6rjaaMidH+Xbn+CGDSoKq8z+d5PUMK7+Q3s3ILzPp15n02B9/X2bVSk26A6GqQxNm0ahVSB5v8p4KaX3sPVDVMx1CXk+SJ5DsEV2jqA2E9e9ASPXismUeM3nXmfRpeekh71xmKboDodqukmdfS/LoKP+Hpq45Jt2OKauok26S9w/FnkWBduzLVHOwjcGmQ1WtrTL1jYzKWdXnNdT+nNzPu0HmQCPzh5D2skmr4zVHVVMtZmG2sAH9tCnYlXcg1lWuaKBM8DxIOlQPAM8AWEvyVehKdZmINMaY+EwDy80Skb9GaePN8eAG1lsKx5jj5SQPT/4ArDR5R+W05U8iEhvlx6PyHI/UO2iOiPwuyr8PqdfQ3gAGAYCILBGR50XkJgCdqZP43TCrOaQ7KyB7r+PsBURkEYA3G3UXxTnWHC8AMNi8l81Id1nJqnQlgGTy6wPgfwCsIzkBuqJeLCJrKtDOV6Pz982xnQiGmONnozLjkO4aSmEEUs/QN0Qk9rK83dQ3kGS/nDpm2gA8qAYgoSQbDHQ3l4yNL4nIagAIAZdPGrk4/iL2qhqG9H5eCXW8B2BJSDuKutBNdly1yO6YEMqMg3pcHgfdoc2LRDoCeJDkkLhspdmVJ5A9zfGqglIpowDYH1In6Au8FcAcki9RI0YbwqIGlluRk2aj7At16NhzrCFeJHbHdQtUbZf8/ZfJS36Eti15kdcFvw7QhFhV5XtxpohsR/Zd9AVUhUlyFMm3oX3lWQCXIXVxBNKBGaj/Xj8sr9llYfv1Gci+lz8i/U32Iykhev98ZN1/q6BxP3cAeI/qPNDUare10bldxCXeap2hg1eCXZgkC7u4nmLU9/43RNfIU20Xa3e94x3Va/M8kzSQaleZSHIiUrUTABzLrDE9nkBi9VV83Clca49w/hcR+SSvXSJSKyKvi8gVInIwNCL9aqQLqnaoO6FVnJaOAymG3fq/VZ+wiMyg6v1HAvg6dGVtO/cI6Ioo9usuhYb6yue5HlaZ40I+27GrbRy4VAo2tmUygI8LyCX+6vaH1iVHrionralZX08bAP2MQ0Ly/G5AGiu0GcD/Avg9dECeHdLtZ1S2muPmvlfbjnehwX6FaA9gm4hMIrkPdGV8BvS3YQPL/gW6w/pKE7Zza3RemyOzBWpjSZ5XDwDrkkyS7ZEOjqXQ0PdvKaXdxRiOdFEFAAeEv0JcDOC74XgedAHTE2oz/NeQXgPgNVNmElKblXXuyLgHk3wcuvPYC8A37edPgs3ldqo68+aQfHCRdlaEXXICITkc6cOoRWosrI82AF4QkfvC6ugYqPE0iSYdSrJXUGfZjtU2rPYKbbfjTlkqg0hWRVtquyq2agE74McTyN4F6rf3EL/LDxBUPAAeEZFHkwyqnWCriNRE8jvbSLJt9O2qSqrbEqzabDDJLiJSnSSEBUKy6qwFMDsMUsmPcAeAQSKyMMhbu4t9VvZeY5fpdkifWyWw73ymiJxnrt0eQLsCwWBtAPxGRMZSPQX/EbpYOjvkn0iycyhbrF80GSJCkosAJKvwYci+w5NQdzddDFv2SJId7He6SA5GOrFsQX4Abzkqszxs5Pkm5P/22yGdyEaSvFZENofn8QaAxNU4iYd5K9pZvBLaKQAGmPQ4vmR/pCrmCwFMR13sIrXZgwhbWoXViRokNIDkIKoR8Vpk9e3jgt6wIKHcCqgn0gSSHcMLnQS1gawz4sk92x+aoO6gbWnoRwC7QlfHSTv3g3oQJUw0x3brbWNW+kI9dPKwE9PuzPq5v2yOL2P28wuPAqimGu4TV96Z0OcH6IrnO6YNhyLrldIQ+pt3XecvyEwHsDgc9wBwD1ODcVcADyCrm14FHVCSQaUG2Z3WCHNsV7QTzPG3qBG/CVciuwJtaux7OZOk9VK6CPpeFpC8GQCozgEfQ9Wzz4WJvVpEXoKuYhMHEEH6cVTbL6rCxFQpXjLHPyZ5LDVu5WiozaocJiL9HfQHcFtQKYHqOmxVr+OjhVmjoX4I9VSTdJKIdI//oB5wycSSRKYnxF8lAIL9I0FEPgbwl/jyOWWfMsejqE4Ee4S2diZ5IbJfoqgT4Pg3B0v7mGLC+4w8N5jvhdWB2SCrP1E9ba6jBgImvBbVZb1RFlBjHXqHPOuFVUeFxNK9sEjyLZLPMxu8ON/WSw2QtOWeJPkg1avMRrBaL6yuzMaZzKXGBAg1uOsDkzeP5FhqYFfCema9cK5nlilBvjp6Hg3xwiqKKXc6s378K0I77LP7hMZ1kVkPlSkkL6XGisQfoEsmo7bMer1VU+OO/hjO7b1WIg7kSZO/lhrF/EuqN03CqUF2d5IfmfSpJK+lxrHMNOnPmvrbMxs/MI8ak5QErpXihXVY1GYbZzXWpPcKdVuS576RWY+2UuJAzo/qWkZ9p+tN2krqwiopY8eUh6L6Opm8op8sYtbbcQGLxFlQAzgTXjfpR7Auw3LK3x7JzM2R6URyTk59eTFEy1jmFztaJSxtAqkhOY45hkEWDiTcn3UjdS1zGHltkHwoR+6IkNcUE8hY6mQWs5zkoKi+bswGXVnZy8z5nVG5CTlleoa8gcxG81rWM4pGpwaF/SZHdhPJi815xSaQUPZcZgcMyxLWdY09jXUj0EmNXJ5qzo8zZQZQI7Jj5pK82ZxXYgLpwsLBkjtIXh3JD2LxQMk3GX1qhNmAtYQBIa/JJpCQN5Tk0uhaa6lfa7DvsaTPkVD7+6YC9zqfuiO28k01gdjPidxYj+zwqF2HhPR20T1XM/rybpAbEZV/oMB1+pGcUeBZJMyNn0lz0RI2kLeRfoTQshXqabIU+i38pQXK535MUUQWhod4FjSIZx+oEX0p1CVxvPnCZcLlUH34sVA11btIPXBuQ6ouyet4hT6mON+kT4AGOF4A4MtQw+cMAPeKiFWrQUTWUSevS6F6z8Sl72GoKqxPEJ2KLGcD+B40eGsLgHfCvxCRuVQvkW9Cg716QY187wB4OHb/DDaRc0iOhzoidIMG1t0P9ShLVE2xa3IeSQBb2YjIo9RJ6myowbgXgI+g7/6J2EYgIv9N1Y+PhuqNq6FG9CegdrDEuNzJlHmfGsh5CdSeUAsNznwIahdJdPeJEb4c7kD626rjiSci1dTvHZ0CVZn0hfb/+VB71bxIfjY1nuic0LZ+of4lULXP88FDzXIB1EB/JDQ4djZSFWWhjyn+EqmXWOx0MQPp+8y4morIzNC+k6FG31VQW+RaZr8dV5IziojcQ/KZcL+HQ20Jy6GqoN/m/P8ldkyJXbBrTF5Bgzo1luYFpPbWR+pp5iRokGuiHuwZ2l5Dcgx0/AGAJTnjDqDqKvv7eD7vIiKylORR0PFjBPQjirsB+BQ6tk0C8GLO+28WWjwU3nGc1gvJa6BeSosBzBaRF0zentCJHwBWiEghZxCnlbJLemE5jtNq2AOp59J2kpdCdwS9kDXwTo4LOo7jOH/HUD/4FxvRYzYw+nqt4ziO4yQOCY9TDf3Wg+5TapT8IfXX4rRG3AbiOE6TQY056QV15FgrIuVGgjuO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziOUyr/D8QA7LGXVkTnAAAAAElFTkSuQmCC"
   },
   "DependsOn": [
    "MCPServerDLTUserPoolDomainA26D16C0",
    "DLTCognitoAuthDLTUserPoolClientA2F8B2DB"
   ],
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete"
  },
  "DLTCognitoAuthDLTIdentityPoolE110578F": {
   "Type": "AWS::Cognito::IdentityPool",
   "Properties": {
    "AllowUnauthenticatedIdentities": false,
    "CognitoIdentityProviders": [
     {
      "ClientId": {
       "Ref": "DLTCognitoAuthDLTUserPoolClientA2F8B2DB"
      },
      "ProviderName": {
       "Fn::GetAtt": [
        "DLTCognitoAuthDLTUserPoolFA41A712",
        "ProviderName"
       ]
      }
     }
    ]
   }
  },
  "DLTCognitoAuthDLTCognitoAuthorizedRole9977D4DC": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Fn::If": [
        "DLTCognitoAuthIsGovCloudPartition9F5A131A",
        {
         "Fn::If": [
          "DLTCognitoAuthIsGovCloudEastRegion022D5DDD",
          {
           "Effect": "Allow",
           "Principal": {
            "Federated": "cognito-identity.us-gov-east-1.amazonaws.com"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
            "StringEquals": {
             "cognito-identity.us-gov-east-1.amazonaws.com:aud": {
              "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
             }
            },
            "ForAnyValue:StringLike": {
             "cognito-identity.us-gov-east-1.amazonaws.com:amr": "authenticated"
            }
           }
          },
          {
           "Effect": "Allow",
           "Principal": {
            "Federated": "cognito-identity-us-gov.amazonaws.com"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
            "StringEquals": {
             "cognito-identity-us-gov.amazonaws.com:aud": {
              "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
             }
            },
            "ForAnyValue:StringLike": {
             "cognito-identity-us-gov.amazonaws.com:amr": "authenticated"
            }
           }
          }
         ]
        },
        {
         "Effect": "Allow",
         "Principal": {
          "Federated": "cognito-identity.amazonaws.com"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
          "StringEquals": {
           "cognito-identity.amazonaws.com:aud": {
            "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
           }
          },
          "ForAnyValue:StringLike": {
           "cognito-identity.amazonaws.com:amr": "authenticated"
          }
         }
        }
       ]
      }
     ],
     "Version": "2012-10-17"
    },
    "Description": {
     "Fn::Join": [
      "",
      [
       {
        "Ref": "AWS::StackName"
       },
       " Identity Pool authenticated role"
      ]
     ]
    },
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "execute-api:Invoke",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":execute-api:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":",
            {
             "Ref": "DLTApi0C903EB5"
            },
            "/prod/*"
           ]
          ]
         }
        },
        {
         "Action": [
          "s3:PutObject",
          "s3:GetObject"
         ],
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            {
             "Fn::GetAtt": [
              "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
              "Arn"
             ]
            },
            "/public/*"
           ]
          ]
         }
        },
        {
         "Action": "s3:GetObject",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            {
             "Fn::GetAtt": [
              "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
              "Arn"
             ]
            },
            "/results/*"
           ]
          ]
         }
        },
        {
         "Action": "s3:GetObject",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            {
             "Fn::GetAtt": [
              "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
              "Arn"
             ]
            },
            "/regional-template/*"
           ]
          ]
         }
        },
        {
         "Action": "s3:ListBucket",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "DLTTestRunnerStorageDLTScenariosBucketA9290D21",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "InvokeApiPolicy"
     },
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "iot:AttachPolicy",
         "Effect": "Allow",
         "Resource": "*"
        },
        {
         "Action": "iot:Connect",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":iot:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":client/*"
           ]
          ]
         }
        },
        {
         "Action": "iot:Subscribe",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":iot:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":topicfilter/dlt/*"
           ]
          ]
         }
        },
        {
         "Action": "iot:Receive",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":iot:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":topic/dlt/*"
           ]
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "IoTPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W11",
       "reason": "iot:AttachPolicy does not allow for resource specification"
      },
      {
       "id": "F10",
       "reason": "requires inline policies"
      }
     ]
    }
   }
  },
  "DLTCognitoAuthDLTCognitoUnauthorizedRole6FC43D42": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Fn::If": [
        "DLTCognitoAuthIsGovCloudPartition9F5A131A",
        {
         "Fn::If": [
          "DLTCognitoAuthIsGovCloudEastRegion022D5DDD",
          {
           "Effect": "Allow",
           "Principal": {
            "Federated": "cognito-identity.us-gov-east-1.amazonaws.com"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
            "StringEquals": {
             "cognito-identity.us-gov-east-1.amazonaws.com:aud": {
              "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
             }
            },
            "ForAnyValue:StringLike": {
             "cognito-identity.us-gov-east-1.amazonaws.com:amr": "unauthenticated"
            }
           }
          },
          {
           "Effect": "Allow",
           "Principal": {
            "Federated": "cognito-identity-us-gov.amazonaws.com"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
            "StringEquals": {
             "cognito-identity-us-gov.amazonaws.com:aud": {
              "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
             }
            },
            "ForAnyValue:StringLike": {
             "cognito-identity-us-gov.amazonaws.com:amr": "unauthenticated"
            }
           }
          }
         ]
        },
        {
         "Effect": "Allow",
         "Principal": {
          "Federated": "cognito-identity.amazonaws.com"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
          "StringEquals": {
           "cognito-identity.amazonaws.com:aud": {
            "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
           }
          },
          "ForAnyValue:StringLike": {
           "cognito-identity.amazonaws.com:amr": "unauthenticated"
          }
         }
        }
       ]
      }
     ],
     "Version": "2012-10-17"
    }
   }
  },
  "DLTCognitoAuthCognitoAttachRole8337C7A4": {
   "Type": "AWS::Cognito::IdentityPoolRoleAttachment",
   "Properties": {
    "IdentityPoolId": {
     "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
    },
    "Roles": {
     "unauthenticated": {
      "Fn::GetAtt": [
       "DLTCognitoAuthDLTCognitoUnauthorizedRole6FC43D42",
       "Arn"
      ]
     },
     "authenticated": {
      "Fn::GetAtt": [
       "DLTCognitoAuthDLTCognitoAuthorizedRole9977D4DC",
       "Arn"
      ]
     }
    }
   }
  },
  "DLTCognitoAuthCognitoUser8FAEDC59": {
   "Type": "AWS::Cognito::UserPoolUser",
   "Properties": {
    "DesiredDeliveryMediums": [
     "EMAIL"
    ],
    "ForceAliasCreation": true,
    "UserAttributes": [
     {
      "Name": "email",
      "Value": {
       "Ref": "AdminEmail"
      }
     },
     {
      "Name": "nickname",
      "Value": {
       "Ref": "AdminName"
      }
     },
     {
      "Name": "email_verified",
      "Value": "true"
     }
    ],
    "UserPoolId": {
     "Ref": "DLTCognitoAuthDLTUserPoolFA41A712"
    },
    "Username": {
     "Ref": "AdminName"
    }
   }
  },
  "WebConsoleAssetsHandlerServiceRole90869694": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "ManagedPolicyArns": [
     {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
       ]
      ]
     }
    ]
   }
  },
  "WebConsoleAssetsHandlerServiceRoleDefaultPolicyBFD9C256": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "s3:DeleteObject*",
        "s3:PutObject",
        "s3:PutObjectLegalHold",
        "s3:PutObjectRetention",
        "s3:PutObjectTagging",
        "s3:PutObjectVersionTagging",
        "s3:Abort*"
       ],
       "Effect": "Allow",
       "Resource": [
        {
         "Fn::GetAtt": [
          "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.1.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.1.0/07a90cc3efdfc34da22208dcd9d211f06f5b0e01b21e778edc7c3966b1f61d57.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": "nodejs22.x",
    "Timeout": 900
   },
   "DependsOn": [
    "WebConsoleAssetsProviderframeworkonEventServiceRoleDefaultPolicy819CE4DA",
    "WebConsoleAssetsProviderframeworkonEventServiceRole3DF0B98A"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W89",
       "reason": "Lambda does not need VPC - only writes to S3"
      },
      {
       "id": "W92",
       "reason": "Temporary custom resource - no reserved concurrency needed"
      }
     ]
    }
   }
  },
  "WebConsoleAssets29CA09CF": {
   "Type": "AWS::CloudFormation::CustomResource",
   "Properties": {
    "ServiceToken": {
     "Fn::GetAtt": [
      "WebConsoleAssetsProviderframeworkonEvent35FDF5FD",
      "Arn"
     ]
    },
    "UserPoolId": {
     "Ref": "DLTCognitoAuthDLTUserPoolFA41A712"
    },
    "PoolClientId": {
     "Ref": "DLTCognitoAuthDLTUserPoolClientA2F8B2DB"
    },
    "IdentityPoolId": {
     "Ref": "DLTCognitoAuthDLTIdentityPoolE110578F"
    },
    "UserPoolDomain": {
     "Fn::Join": [
      "",
      [
       "dlt-",
       {
        "Fn::GetAtt": [
         "DLTCustomResourcesCustomResourceUuidD1C03F15",
         "UUID"
        ]
       },
       {
        "Fn::If": [
         "DLTCognitoAuthIsGovCloudPartition9F5A131A",
         ".auth-fips.",
         ".auth."
        ]
       },
       {
        "Ref": "AWS::Region"
       },
       ".amazoncognito.com"
      ]
     ]
    },
    "ApiEndpoint": {
     "Fn::Join": [
      "",
      [
       "https://",
       {
        "Ref": "DLTApi0C903EB5"
       },
       ".execute-api.",
       {
        "Ref": "AWS::Region"
       },
       ".",
       {
        "Ref": "AWS::URLSuffix"
       },
       "/",
       {
        "Ref": "DLTApiDeploymentStageprodC81F8DCB"
       }
      ]
     ]
    },
    "UserFilesBucket": {
     "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
    },
    "UserFilesBucketRegion": {
     "Ref": "AWS::Region"
    },
    "IoTEndpoint": {
     "Fn::GetAtt": [
      "DLTCustomResourcesGetIotEndpoint700ABCC8",
      "IOT_ENDPOINT"
     ]
    },
    "IoTPolicy": {
     "Ref": "DLTCognitoAuthIoTPolicyB8FDFE53"
    },
    "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"
  },
  "MCPServerMCPToolLambdaFunctionA0B6CA8F": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/1bc11925770d57b53b7f1faef25559de7149d1494af06aa60019f393758a67e9.zip"
    },
    "Description": "MCP Tool Lambda Function",
    "Environment": {
     "Variables": {
      "AWS_ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      },
      "API_GATEWAY_ENDPOINT": {
       "Fn::Join": [
        "",
        [
         "https://",
         {
          "Ref": "DLTApi0C903EB5"
         },
         ".execute-api.",
         {
          "Ref": "AWS::Region"
         },
         ".",
         {
          "Ref": "AWS::URLSuffix"
         },
         "/",
         {
          "Ref": "DLTApiDeploymentStageprodC81F8DCB"
         }
        ]
       ]
      },
      "SCENARIOS_BUCKET_NAME": {
       "Ref": "DLTTestRunnerStorageDLTScenariosBucketA9290D21"
      },
      "SOLUTION_ID": "SO0062",
      "VERSION": "v4.1.0",
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "METRIC_URL": "https://metrics.awssolutionsbuilder.com/generic"
     }
    },
    "Handler": "index.handler",
    "MemorySize": 512,
    "Role": {
     "Fn::GetAtt": [
      "MCPServerMCPToolLambdaRole83B130EC",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 60
   },
   "DependsOn": [
    "MCPServerMCPToolLambdaRole83B130EC"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W89",
       "reason": "VPC not needed for lambda"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   },
   "Condition": "DeployMCPServerCondition"
  },
  "MCPServerAgentCoreGatewayRole50366203": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "bedrock-agentcore.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "Description": "IAM role for AgentCore Gateway",
    "Policies": [
     {
      "PolicyDocument": {
       "Statement": [
        {
         "Action": "bedrock-agentcore:GetGateway",
         "Effect": "Allow",
         "Resource": {
          "Fn::Join": [
           "",
           [
            "arn:",
            {
             "Ref": "AWS::Partition"
            },
            ":bedrock-agentcore:",
            {
             "Ref": "AWS::Region"
            },
            ":",
            {
             "Ref": "AWS::AccountId"
            },
            ":gateway/dlt-mcp-server"
           ]
          ]
         }
        },
        {
         "Action": "lambda:InvokeFunction",
         "Effect": "Allow",
         "Resource": {
          "Fn::GetAtt": [
           "MCPServerMCPToolLambdaFunctionA0B6CA8F",
           "Arn"
          ]
         }
        }
       ],
       "Version": "2012-10-17"
      },
      "PolicyName": "AgentCoreGatewayPolicy"
     }
    ]
   },
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "F10",
       "reason": "requires in-line role permissions."
      }
     ]
    }
   },
   "Condition": "DeployMCPServerCondition"
  },
  "MCPServerAgentCoreGatewayConstructDltAgentCoreGatewayDBEF1612": {
   "Type": "AWS::BedrockAgentCore::Gateway",
   "Properties": {
    "AuthorizerConfiguration": {
     "CustomJWTAuthorizer": {
      "AllowedClients": [
       {
        "Ref": "DLTCognitoAuthDLTUserPoolClientA2F8B2DB"
       },
       {
        "Ref": "MCPServerDLTUserPoolClientMachineToMachineF3DA2105"
       }
      ],
      "DiscoveryUrl": {
       "Fn::Join": [
        "",
        [
         "https://cognito-idp.",
         {
          "Ref": "AWS::Region"
         },
         ".amazonaws.com/",
         {
          "Ref": "DLTCognitoAuthDLTUserPoolFA41A712"
         },
         "/.well-known/openid-configuration"
        ]
       ]
      }
     }
    },
    "AuthorizerType": "CUSTOM_JWT",
    "Description": "DLT MCP Server managed by AgentCore Gateway",
    "Name": "dlt-mcp-server",
    "ProtocolType": "MCP",
    "RoleArn": {
     "Fn::GetAtt": [
      "MCPServerAgentCoreGatewayRole50366203",
      "Arn"
     ]
    }
   },
   "Condition": "DeployMCPServerCondition"
  },
  "MCPServerAgentCoreGatewayTargetConstructDltAgentCoreGatewayTarget40580AC0": {
   "Type": "AWS::BedrockAgentCore::GatewayTarget",
   "Properties": {
    "CredentialProviderConfigurations": [
     {
      "CredentialProviderType": "GATEWAY_IAM_ROLE"
     }
    ],
    "Description": "Tool provider for DLT MCP server",
    "GatewayIdentifier": {
     "Fn::GetAtt": [
      "MCPServerAgentCoreGatewayConstructDltAgentCoreGatewayDBEF1612",
      "GatewayIdentifier"
     ]
    },
    "Name": "DltMcpToolsLambda",
    "TargetConfiguration": {
     "Mcp": {
      "Lambda": {
       "LambdaArn": {
        "Fn::GetAtt": [
         "MCPServerMCPToolLambdaFunctionA0B6CA8F",
         "Arn"
        ]
       },
       "ToolSchema": {
        "InlinePayload": [
         {
          "Description": "Retrieve a list of all available test scenarios",
          "InputSchema": {
           "Required": [],
           "Type": "object"
          },
          "Name": "list_scenarios"
         },
         {
          "Description": "Retrieve the test configuration and most recent test run for a single test scenario",
          "InputSchema": {
           "Properties": {
            "test_id": {
             "Description": "The test scenario's unique identifier",
             "Type": "string"
            }
           },
           "Required": [
            "test_id"
           ],
           "Type": "object"
          },
          "Name": "get_scenario_details"
         },
         {
          "Description": "Retrieve a list of test runs for a specific test scenario, sorted newest to oldest. More detailed results for a test run can be retrieved with \"get_test_run\". Note: Only one of 'limit' or 'start_timestamp' may be provided, not both. There is a maximum limit of 30 test runs returned.",
          "InputSchema": {
           "Properties": {
            "test_id": {
             "Description": "The test scenario's unique identifier",
             "Type": "string"
            },
            "limit": {
             "Description": "The maximum number of test runs to return (e.g. if I want the 10 most recent test runs, set the limit to 10). Cannot be used with start_timestamp parameter. Must be a positive integer. Default value is 20 and maximum limit is 30.",
             "Type": "integer"
            },
            "start_timestamp": {
             "Description": "Return all test runs going back to start_timestamp. The date must be in ISO 8601 timestamp format (e.g. '2024-01-15T14:30:00.000Z'). Cannot be used with limit parameter. Date format is strictly validated. There is a limit of 30 test runs that can be returned.",
             "Type": "string"
            }
           },
           "Required": [
            "test_id"
           ],
           "Type": "object"
          },
          "Name": "list_test_runs"
         },
         {
          "Description": "Retrieve a single test run for a specific test scenario. Results will be provided with a breakdown 1/ for each region (e.g. \"us-east-1\", \"us-west-2\") that the test runs in as well as an aggregate \"total\" 2/ for each endpoint (referred to as \"label\").",
          "InputSchema": {
           "Properties": {
            "test_id": {
             "Description": "The test scenario's unique identifier",
             "Type": "string"
            },
            "test_run_id": {
             "Description": "The test run's unique identifier",
             "Type": "string"
            }
           },
           "Required": [
            "test_id",
            "test_run_id"
           ],
           "Type": "object"
          },
          "Name": "get_test_run"
         },
         {
          "Description": "Retrieve the most recent test run for a specific test scenario",
          "InputSchema": {
           "Properties": {
            "test_id": {
             "Description": "The test scenario's unique identifier",
             "Type": "string"
            }
           },
           "Required": [
            "test_id"
           ],
           "Type": "object"
          },
          "Name": "get_latest_test_run"
         },
         {
          "Description": "Retrieve the baseline test run for a specific test scenario. Users are able to set a baseline run for comparisons",
          "InputSchema": {
           "Properties": {
            "test_id": {
             "Description": "The test scenario's unique identifier",
             "Type": "string"
            }
           },
           "Required": [
            "test_id"
           ],
           "Type": "object"
          },
          "Name": "get_baseline_test_run"
         },
         {
          "Description": "Retrieve the S3 bucket name and path prefix for test run output (logs, error files, results, etc). Starting in v4.0.0, each test run's artifacts will have a unique path that includes a concatenated prefix of timestamp + test run id (\"testRunPath\" in the response object). Test runs prior to v4.0.0 will live in a shared path without clear separation (\"testScenarioPath\" in the response object). If \"testRunPath\" has no objects, try falling back to \"testScenarioPath\" for the legacy artifact storage behavior.",
          "InputSchema": {
           "Properties": {
            "test_id": {
             "Description": "The test scenario's unique identifier",
             "Type": "string"
            },
            "test_run_id": {
             "Description": "The test run's unique identifier",
             "Type": "string"
            }
           },
           "Required": [
            "test_id",
            "test_run_id"
           ],
           "Type": "object"
          },
          "Name": "get_test_run_artifacts"
         }
        ]
       }
      }
     }
    }
   },
   "DependsOn": [
    "MCPServerAgentCoreGatewayConstructDltAgentCoreGatewayDBEF1612"
   ],
   "Condition": "DeployMCPServerCondition"
  },
  "SolutionMetricsNewMetricsLambdaServiceRole3196BDF4": {
   "Type": "AWS::IAM::Role",
   "Properties": {
    "AssumeRolePolicyDocument": {
     "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
        "Service": "lambda.amazonaws.com"
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "ManagedPolicyArns": [
     {
      "Fn::Join": [
       "",
       [
        "arn:",
        {
         "Ref": "AWS::Partition"
        },
        ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
       ]
      ]
     }
    ]
   }
  },
  "SolutionMetricsNewMetricsLambdaServiceRoleDefaultPolicy3AE130AC": {
   "Type": "AWS::IAM::Policy",
   "Properties": {
    "PolicyDocument": {
     "Statement": [
      {
       "Action": [
        "sqs:SendMessage",
        "sqs:GetQueueAttributes",
        "sqs:GetQueueUrl"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "SolutionMetricsNewLambdaToSqsToLambdalambdatosqsqueue2170C89E",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "sqs:ReceiveMessage",
        "sqs:ChangeMessageVisibility",
        "sqs:GetQueueUrl",
        "sqs:DeleteMessage",
        "sqs:GetQueueAttributes"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "SolutionMetricsNewLambdaToSqsToLambdalambdatosqsqueue2170C89E",
         "Arn"
        ]
       }
      },
      {
       "Action": "cloudwatch:GetMetricData",
       "Effect": "Allow",
       "Resource": "*"
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTaskRunnerLambdaLogGroupF801BE82",
         "Arn"
        ]
       }
      },
      {
       "Action": "logs:DescribeQueryDefinitions",
       "Effect": "Allow",
       "Resource": "*"
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "RealTimeDataRealTimeDataPublisherLogGroup3FE55F9A",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionResultsParserLambdaLogGroupADF0ADEA",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTaskCancellerLambdaLogGroupBD1D284E",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctiontaskStatusCheckerLambdaLogGroup1988969D",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTestCleanupLambdaLogGroupC7B4FECA",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTApidltApiServicesLambdaLogGroup54338B12",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionStabilizationCheckerLambdaLogGroup42149834",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionStartCommandLambdaLogGroupB730B794",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionRegionalSyncLambdaLogGroup303B7022",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionTaskFailureHandlerLambdaLogGroupE7AB6C96",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionOrphanCleanupLambdaLogGroupE96F9900",
         "Arn"
        ]
       }
      },
      {
       "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults"
       ],
       "Effect": "Allow",
       "Resource": {
        "Fn::GetAtt": [
         "DLTLambdaFunctionSFNFailureHandlerLambdaLogGroup967B3D84",
         "Arn"
        ]
       }
      }
     ],
     "Version": "2012-10-17"
    },
    "PolicyName": "SolutionMetricsNewMetricsLambdaServiceRoleDefaultPolicy3AE130AC",
    "Roles": [
     {
      "Ref": "SolutionMetricsNewMetricsLambdaServiceRole3196BDF4"
     }
    ]
   }
  },
  "SolutionMetricsNewMetricsLambda2B1B8902": {
   "Type": "AWS::Lambda::Function",
   "Properties": {
    "Architectures": [
     "arm64"
    ],
    "Code": {
     "S3Bucket": {
      "Fn::Sub": "solutions-${AWS::Region}"
     },
     "S3Key": "distributed-load-testing-on-aws/v4.1.0/e224023191ac76ba64afa9ae920f86c1b0fb0a23b5d616afbb745dbc45409af0.zip"
    },
    "Description": "Metrics util",
    "Environment": {
     "Variables": {
      "QUERY_PREFIX": {
       "Fn::Join": [
        "",
        [
         {
          "Ref": "AWS::StackName"
         },
         "-"
        ]
       ]
      },
      "SOLUTION_ID": "SO0062",
      "SOLUTION_NAME": "distributed-load-testing-on-aws",
      "SOLUTION_VERSION": "custom-v4.1.0",
      "UUID": {
       "Fn::GetAtt": [
        "DLTCustomResourcesCustomResourceUuidD1C03F15",
        "UUID"
       ]
      },
      "ACCOUNT_ID": {
       "Ref": "AWS::AccountId"
      },
      "EXECUTION_DAY": "MON",
      "SQS_QUEUE_URL": {
       "Ref": "SolutionMetricsNewLambdaToSqsToLambdalambdatosqsqueue2170C89E"
      }
     }
    },
    "Handler": "index.handler",
    "MemorySize": 128,
    "Role": {
     "Fn::GetAtt": [
      "SolutionMetricsNewMetricsLambdaServiceRole3196BDF4",
      "Arn"
     ]
    },
    "Runtime": "nodejs24.x",
    "Timeout": 60
   },
   "DependsOn": [
    "SolutionMetricsNewMetricsLambdaServiceRoleDefaultPolicy3AE130AC",
    "SolutionMetricsNewMetricsLambdaServiceRole3196BDF4"
   ],
   "Metadata": {
    "cfn_nag": {
     "rules_to_suppress": [
      {
       "id": "W58",
       "reason": "CloudWatchLogsPolicy covers a permission to write CloudWatch logs."
      },
      {
       "id": "W89",
       "reason": "This Lambda function does not require a VPC"
      },
      {
       "id": "W92",
       "reason": "Does not run concurrent executions"
      }
     ]
    }
   }
  },
  "SolutionMetricsNewMetricsLambdaAwsEventsLambdaInvokePermission1458D855B": {
   "Type": "AWS::Lambda::Permission",
   "Properties": {
    "Action": "lambda:InvokeFunction",
    "FunctionName": {
     "Fn::GetAtt": [
      "SolutionMetricsNewMetricsLambda2B1B8902",
      "Arn"
     ]
    },
    "Principal": "events.amazonaws.com",
    "SourceArn": {
     "Fn::GetAtt": [
      "SolutionMetricsNewEventbridgeRuleToLambdaEventsRuleBB9E5FFD",
      "Arn"
     ]
    }
   }
  },
  "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/3VVyXLbOBD9ltwhxEtyH4WyE1fZE0XUeI4qCGxRsEA0jW5IpWLx36cAkiK9zIW9orH068cb2dx8/yavvqgTzXRxmFmzlU3OSh9EtnNL5VUFDD4aq2AhyidV18aVUc3QFYYNOqFOtGlA38gm27nnZRajedg64Kg9OAbvgH8qhpM6p2oYGNZq29V8XmZ9bM6s9L4Cx5essda4aE6E2qi0dwyDDt7w+afHUH9w3JUeiFphVCWbJVqj0xF6bYXdGaJsBd3K5kfQh+7gvdaJceUbuzN+KIJWWFVtC7VxWMALyb+TuA9Op3PS7aZRRMAk51GIAmqL53hX2RVZXBxDqfSelwrZzj2qM/hn8BTt3LjSAuOYMU1dgq8MpcS7IzjOMXgNk/Z99LZCWwzFzqPjtPVvb0rj5loDUYaOPVqxAqrREfwCVYCn8Vk+DywMsTfbMBxrareiODtVYbGVzQUMSWkFaEpHyGygCMF75UsV20+HBeyMM0PB9x50rIwDP/paYbEk2TxieUHIRc/DlrQ3dUy8N7ZH+yfePwH8+e3W71z9850U671s5lb5KmYlpRUQn5tkMwxSlK0ghnrXd41kkwetAQqxVETiSdUi26PRIP5VhkXOiuFJ6b1x3VRM7HeVNqzoQPIxoejBHfEAQtWm7KZMNisgntemb9ugzrXG4FiMQEwdG62cVTlsXUKEQoJPRL94At5jkSii04Zov0mnr+A1APGzsqZQjB21vPO1wiDLcUQ1ls4wyuYfAr9EtHHRVH/EcgHWHMGfM3Q7UwZ/4YYhb4GVMk4MZmZNf72PnocCHBs+D+WndqSJtyQ1rI/yUn64bw7+2CHq80grtlB41AdVgmONHhLoJ0zZq2vlS+BW0CvJ5k+AAD0AA4j0HedwYratSFwT2xWnvicoG1lko06krZHzE2XWJGIRWSDG6n8aNzp/B64DC52yN76PkFx6PJoi3ur66kpef/kr/lcIbRp2mml0xD5opq8x0IxkM6NbmUXrPlprzG+7cdl6U5Qw68nwbnStsYN2f6NZQ680pHWRNeavdEmLzzbxp3cc8id5bSsiecsX+nq8+Sav47/xhYyZ+eDYVCBXnfwPeKuyNDkHAAA="
   },
   "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"
  }
 }
}